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

來源:互聯網
上載者:User

標籤: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)直接跳過的問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.