while((ch=getchar()) !=EOF && ch != '\n');語句作用


while((ch=getchar()) !=EOF && ch != '\n');語句作用:清除輸入緩存。

  如:需要使用函數scanf讀取數字123,實際輸入的的數據為:123\n(回車),而scanf函數只是讀取數字123,\n(回車)還放在輸入緩沖內,后續讀取數據就可能出錯。

示例:

 1 int main(void)
 2 {
 3    char name[20] = {0};
 4    char sex = 0;
 5    int ch = 0;
 6 
 7    printf("Input:");
 8    scanf("%s", &name);
 9    printf("name:%s!\n",name);
10    printf("Input2:");
11    scanf("%c", &sex);
12    if (sex == 'F' || sex == 'M')
13    {
14         printf("sex:%c!\n",sex);
15    }
16    else if (sex == ' ')
17    {
18         printf("ERROR: A Space!\n");
19    }
20    else
21    {
22         printf("ERROR!\n");
23    }
24    
25    return 0;
26 }

輸出:

   由於Li與Ming之間存在的空格,第一個scanf獲取的輸入為Li,而后面的數據都在輸入緩存中,第二個scanf會直接從輸入緩存中讀取一個字符輸入,即第一次輸入的空格,因此只輸入一次回車以后就會輸出如上信息。

改進版:

 1 int main(void)
 2 {
 3    char name[20] = {0};
 4    char sex = 0;
 5    int ch = 0;
 6 
 7    printf("Input:");
 8    scanf("%s", &name);
 9    printf("name:%s!\n",name);
10    while((ch=getchar()) !=EOF && ch != '\n'); 11    printf("Input2:");
12    scanf("%c", &sex);
13    if (sex == 'F' || sex == 'M')
14    {
15         printf("sex:%c!\n",sex);
16    }
17    else if (sex == ' ')
18    {
19         printf("ERROR: A Space!\n");
20    }
21    else
22    {
23         printf("ERROR!\n");
24    }
25    
26    return 0;
27 }

輸出:

  很明顯消除了第二個輸入讀取字符錯誤問題。

注意:要使用while((ch=getchar()) !=EOF && ch != '\n');形式,不要使用while(ch=getchar() !=EOF && ch != '\n');形式,我在測試的時候少了括號,導致第一次輸入完成以后,必須輸入EOF(windows下使用組合鍵Ctrl+Z),然后回車才能繼續第二個輸入。沒帶括號形式測試結果:

參考:

https://bbs.csdn.net/topics/320130933

 


免責聲明!

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



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