iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
自我挑戰組

大二萌新的學習紀錄系列 第 28

Day 28 : C語言 - 如何解決用scanf連續輸入時,程式會自動斷行的問題?

  • 分享至 

  • xImage
  •  

如標題,scanf是一個「動態輸入」的函數,你可以先宣告一個變數a,再用scanf輸入,賦予它任意值,每次執行程式都可以輸入不同的值給變數a
scanf可以用來輸入字元數字字串…等,格式為: scanf(“形式”, &變數名稱1);

但用scanf連續輸入時,會出現自動結束的問題


假設我們有一程式碼長這樣:

int main() {
	int a;
	char ch;
	printf("請輸入一個整數:");
	scanf("%d", &a);
	printf("請輸入一個字元:");
	scanf("%c", &ch);
	printf("a=%d, c1=%c", a, ch);
	return 0;
}

輸入完20這個整數,並按enter,它就會自動結束,可是我們還有字元c1還沒輸入R!!
https://ithelp.ithome.com.tw/upload/images/20211012/20141088BIfdDvEOPV.png

因為你輸入完整數20,按下的那個enter(回車)被留在緩衝區,以至於被下一個scanf吸收了,所以c1印出來會是空白的

那有沒有什麼方法能解決這件事呢?有!以下有三種解決方法供各位參考


Ex 1:
在第二個scanf裡的%c前面加上「空格」,來抵銷前面按的enter(回車)

int main() {
	int a;
	char ch;
	printf("請輸入一個整數:"); 
	scanf("%d", &a);

	printf("請輸入一個字元:");
	/* 在%c前面加上一個空格 */ 
	scanf(" %c", &ch);
	printf("a=%d, c1=%c", a, ch);
	return 0;
}

這樣就可以成功輸入整數a和字元c1囉!
https://ithelp.ithome.com.tw/upload/images/20211012/20141088npCF837Ste.png


Ex 2:
在第一個scanf後加上ffluch(),清空緩衝區內的資料,這樣第二個scanf就不會吸收到enter(回車)

int main() {
	int a;
	char ch;
	printf("請輸入一個整數:");
	scanf("%d", &a);

    /* 清空緩衝區內的資料 */
	fflush(stdin);

	printf("請輸入一個字元:");
	scanf("%c", &ch);
	printf("a=%d, c1=%c", a, ch);
	return 0;
}

這樣也可以成功輸入整數a和字元c1
https://ithelp.ithome.com.tw/upload/images/20211012/20141088Jik3WJEUcA.png


Ex 3:
你如果不想用fflush()清空緩衝區,你也可以用getchar()去吸收enter(回車)這個字元

int main() {
	int a;
	char ch;
	printf("請輸入一個整數:"); 
	scanf("%d", &a);

	/* 吸收空格這個字元 */
	getchar();

	printf("請輸入一個字元:");	
	scanf("%c", &ch);
	printf("a=%d, c1=%c", a, ch);
	return 0;
}

結果會和使用fllush()一樣:
https://ithelp.ithome.com.tw/upload/images/20211012/20141088eK8ufkWiIP.png


以上三種解決方法,不僅適用enter(回車),也適用於「空格」喔!

現在我們使用Ex 1.的方式,將整數a字元ch放在一起輸入,並在輸入時用「空格」將ach隔開:

int main() {
	int a;
	char ch;
	printf("請輸入一個整數和字元:");
	scanf("%d %c", &a, &ch);
	printf("a=%d, c1=%c", a, ch);
	return 0;
}

這樣也可以成功輸入整數a和字元c1喔!
https://ithelp.ithome.com.tw/upload/images/20211012/20141088nRWnhgyfTu.png


以上就是今天的介紹


上一篇
Day 27 : Python - 什麼是列表推導式?又該如何將它和if、if-else一起做使用?
下一篇
Day 29 : C語言 - 河內塔的程式遞迴執行順序為何?
系列文
大二萌新的學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言