標籤:style color io os ar strong for 資料 div
有時候scanf("%c",&ch)本應該阻塞等待使用者輸入一個char型資料的,但為什麼會跳過呢?例:在該程式段中, int year;
printf("請輸入一個年份:\n");
scanf("%d",&year);
// setbuf(stdin,NULL);//或者直接用getchar();
//在鍵盤輸入一字元,顯示其類型(數字、大寫字母、小寫字母、其他)
char ch;
printf("請輸入一個字元:\n");
scanf("%c",&ch);
if(ch>=‘1‘&&ch<=‘9‘)
printf("this is digital\n");
else if (ch>=‘A‘&&ch<=‘B‘)
printf("this is capital letter\n");
else if (ch>=‘a‘&&ch<=‘z‘)
printf("this is letter\n");
else
printf("other!\n”);會輸出:
請輸入一個年份:
2000
請輸入一個字元
:
other!
例2:
以下程式段:while (n<=0)
{
printf("請輸入字串長度:\n");
scanf("%d",&n);
}
setbuf(stdin,NULL); //<1>
char a[n],b[n];
printf("輸入字串:\n");
for (int i=0; i<n; i++)
{
scanf("%c",&a[i]);
}
printf("輸出字串為:\n");
for (int i=0; i<n; i++)
{
b[i]=a[n-1-i];
printf("%c",b[i]);
}如果將<1>語句去除,會使結果錯誤例:
請輸入字串長度:
5
輸入字串
:
hello
輸出字串為:
lleh
糾其根源,我們先來瞭解一下scanf()是怎麼接受資料的。
首先,當我們的pc指向scanf這句時,系統並不是等待使用者輸入,而是判斷輸入緩衝區有沒有符合格式的內容,如果有,則直接讀取。
知道了這個,我就應該明白,scanf("%c",&ch);不是沒有讀到資料,而是讀到了我們不知道的資料。
那問題又來了,它讀到了什嗎??
好吧,這就要說到行緩衝;
我們用scanf()的時候都要按下enter鍵,那enter鍵按了之後去哪兒了??
好吧,問題基本應該知道了,enter鍵也進入了輸入緩衝區,也就是scanf("%c",&ch);
讀到了‘\n‘;
解決辦法,很簡單,既然緩衝區有東西,那我們就清空它唄~~
setbuf(stdin,NULL);(這個windows和linux下都可以)
fflush(stdin);(這個只能windows);
關於scanf("%c",&ch)直接跳過的問題