企石編程
A. C語言 投票程序
#include <stdio.h>
int main(void)
{
int iNum;
char szStr[128] = "";
scanf("%d", &iNum);
getchar(); /* 嘗試一下去掉這一句會怎樣 */
gets(szStr);
puts(szStr);
return 0;
}
/*
把你不懂的地方分離出來了。
一、運行結果:
①如果有那個getchar:
1
abc
abc
Press any key to continue
②如果沒有那個getchar:
1
Press any key to continue
(注意1後面有個換行,然後輸出「Press any key to continue」)
二、解釋
標准庫中scanf、printf之類的函數是帶緩沖的(我不知道准確點該怎麼說),意思就是: 當用戶調用scanf函數輸入一串數據時, 這些數據並不是直接送給變數了, 而是先送入 標准IO緩沖區, 當執行刷新操作時,這些數據才被賦給變數;
那麼怎麼執行刷新操作呢, 對於scanf函數, 這個刷新操作往往通過敲擊回車鍵來完成。最開始, 標准輸入緩沖區是空的。當你從鍵盤輸入一個整數1時, 這個整數1被送入輸入緩沖區, 然後當你敲一下回車鍵,緩沖區中的1才會被取走賦給iNum;但是scanf函數嫌棄'\n', 這樣, 你剛才敲擊的回車鍵(其實也是一次輸入操作)又往緩沖區中送了一個回車符。
這樣經歷了:輸入1-》敲回車, 完成了給iNum賦值1, 同時輸入緩沖區中留下了一個'\n'
①如果有那個getchar,執行到getchar();這一句,這個函數會嘗試從緩沖區中獲取一個字元,而此時緩沖區中恰好有一個回車符, 所以getchar就把這個回車符拿走了(雖然並沒賦給任何變數),接下來遇到了gets函數, 由於緩沖區是空的, 所以這個函數就等著我們輸入字元串(「abc」), 然後回車, 把這個字元串送給szStr, ……
②如果沒有那個getchar, 執行scanf後, 緩沖區中殘留一個回車符'\n', 然後執行到gets函數時, gets函數也嘗試從緩沖區中讀取字元(串), 恰好此時緩沖區中有個'\n', 而恰好gets函數又不嫌棄'\n',所以gets函數直接拿走了這個換行符送給了szStr, 因此szStr中內容: "\n\0", 這樣調用puts函數時就是輸出一個換行符然後換行輸出「Press any key to continue」
由此可見,這里的getchar具有過濾作用, 不然的話循環體的第一次執行gets(c)將不等待用戶輸入而直接得到一個回車符。
還有不懂可以HI我。
*/