有時候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”);
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!
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]);
}
{
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
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);
