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