關於scanf("%c",&ch)直接跳過的問題



有時候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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM