int main() { char a[20]; char b[20]; char c[20]; printf("請輸入a字符串\n"); scanf("%s",&a); printf("請輸入b字符串\n"); gets(b); printf("請輸入c字符串\n"); gets(c); return 0; }
【分析】程序本意是輸入三個字符串,之所以用printf提示輸入是因為想更清楚地看清程序怎麼運作的,可以從運行界面看到程序提示輸入a字符串和c字符串,但是會越過b字符串不讓輸入。這裡會讓人感到困惑。 因為scanf函數在讀取字符串時,遇到回車、空格、制表符不會進行讀取或轉換,會捨棄掉它們以及它們後面的字符至緩沖區,最後在讀取的字符後面加上‘\0’.因此到了gets(b)的時候就會讀取緩沖區剩下的東西以及最後的換行符就結束了,所以程序不會提示輸入b字符串,但是從監視可以看到b中其實是讀取了字符串的。然後緩沖區無剩余字符gets(c)可以實現輸入c字符串。而且從這個程序也可以體現出來需要用到裡面有空格的字符串的時候可以用gets函數。 這裡還有一個注意點:在gets(c)讀取從鍵盤輸入的字符以及最後需要將緩沖區的數據刷新出去的回車符。它和scanf不同的是不會捨棄回車符至緩沖區中, 而是會丟棄換行符將其改為字符串結束標志‘\0’。所以我們一般喜歡使用這種帶有清理收尾工作的輸入函數。 最後一個點,我們可以看到b字符串其實讀取的是緩沖區中的垃圾數據。因此,為了避免輸入流緩沖區中垃圾數據對後續讀入的影響,需要清空緩沖區。 下面就介紹方法(不同平台) C標准規定 fflush()函數是用來刷新輸出(stdout)緩存的。對於輸入(stdin),它是沒有定義的。但是有些編譯器也定義了 fflush( stdin )的實現,比如微軟的VC。其它編譯器是否也定義了 fflush( stdin )的實現應當查找它的手冊。GCC編譯器沒有定義它的實現,所以不能使用 fflush( stdin )來刷新輸入緩存。 對於沒有定義 fflush( stdin )的編譯器,可以使用 fgets()函數來代替它(比用 getchar()、scanf()等函數通用性好)。可以這樣忽略輸入流中留下的回車等其它輸入,從而使下一次的輸入總保持一個“干淨”的狀態。(這個是任何平台下都可以的) scanf函數讀取字符
int main() { char ch1; char ch2; char ch3; char ch4; scanf("%c",&ch1); scanf("%c",&ch2); scanf("%c",&ch3); scanf("%c",&ch4); return 0; }