才疏淺陋,如有不足之處,歡迎拍磚....
還在學習C的基礎,今天看到了書上的樣本程式中使用while(getchar() != '\n');來消除斷行符號(確切點說應該是去除分行符號)。
剛開始很不理解,為何這個語句能夠去除分行符號,詳細過程是什嗎?為什麼在一些情況下也可以清除斷行符號前的所有的非法輸入?
搜尋了前輩們以前提出的相關問題,重新看了getchar()函數的功能註解以後,慢慢理解了while(getchar() != '\n');的過程。
下面用書上的那個樣本程式來說明:
#include <stdio.h>#define INPUT_LINE_LENGTH40int main(void){FILE *outputFile = NULL;int quitChar;char inputText[INPUT_LINE_LENGTH];outputFile = fopen("outfile.txt","w");if(outputFile){for(quitChar = 'N'; (quitChar != 'y' && quitChar != 'Y'); ){printf("Enter a string of no more than 40 characters\n");printf(">>>");gets(inputText);fputs(inputText,outputFile);fputc('\n',outputFile);printf("\nQuit?(Y/N): ");quitChar = getchar();//本例的while(getchar() != '\n');就屬於可以消除非法輸入的類型while(getchar() != '\n');putchar('\n');putchar('\n');}fclose(outputFile);}return 0;}
其他地方沒有什麼好說的,很簡單。主要介紹下面兩句:
quitChar = getchar();while(getchar() != '\n');
為了弄清有哪些操作,應該先瞭解getchar()函數的行為,下面是引用百度百科的介紹:
getchar():
當程式調用getchar時.程式就等著使用者按鍵.使用者輸入的字元被存放在鍵盤緩衝區中.直到使用者按斷行符號為止(斷行符號字元也放在緩衝區中).
當使用者鍵入斷行符號之後,getchar才開始從stdin流中每次讀入一個字元.
getchar函數的傳回值是使用者輸入的第一個字元的ASCII碼,如出錯返回-1,且將使用者輸入的字元回顯到螢幕.
如使用者在按斷行符號之前輸入了不止一個字元,其他字元會保留在鍵盤緩衝區中,等待後續getchar調用讀取.也就是說:
後續的getchar調用不會等待使用者按鍵,而直接讀取緩衝區中的字元,直到緩衝區中的字元讀完為後,才等待使用者按鍵.
好了,開始正式解釋這上面兩句程式。
quitChar = getchar();
為了方便解釋,假定輸入為:NYYN'\n'(代表NYYN“斷行符號”)
這句使用了getchar()函數,所以quitChar的值被賦值為getchar函數的傳回值是使用者輸入的第一個字元的ASCII碼,即78.
程式繼續向下運行,開始執行
while(getchar() != '\n');
因為鍵盤緩衝區中還存放著輸入的YYN'\n'(N已經被取走),所以while迴圈開始繼續利用getchar()函數來逐個讀取鍵盤緩衝區的剩餘字元。
最後當getchar()遇到'\n‘時,while()迴圈條件不成立,迴圈結束。
就這樣非法輸入的 YYN 和最後的 '\n' 就被該語句消耗掉了,任務完成。