2016-11-11 59 views
4

我只是問在這段代碼中getchar做了什麼,它是如何工作的?我不明白爲什麼getchar會影響代碼,對我來說,好像它只是獲取值,但沒有任何值正在完成。C代碼,scanf和getchar

int c=0; 
while (c>=0) 
{ 
    scanf("%d", &c); 
    getchar(); 
} 
+2

提示:嘗試使用'char'類型。在這裏,這是多餘的。 –

+0

完美謝謝 – james

回答

0

最有可能的代碼是閱讀一個整數列表,用一個新行分隔。

scanf將讀取一個整數,並將其放入變量c中。

的getchar函數正在讀取下一個字符(假設新行)

因爲它不檢查,存在一些潛在的,這不是一個新行,或scanf函數失敗,因爲該是什麼試圖讀取不是一個數字。爲什麼getchar()可能一直使用的

3

一些可能性:如果它這樣做忽略空格)

1)(與%c掃描字符時通常使用的,這不是在這裏需要的,因爲%d忽略空格呢。

2)另一種可能性是,這個循環中,一些進一步的掃描完成,其中最後調用剩下最後\nscanf()可能是一個問題。因此,getchar()可能被用來忽略它。

3)如果您輸入的字符不匹配%d,scanf()將會失敗。因爲您輸入的字符留在輸入流中,您將永遠無法再次讀取int(例如,如果輸入abcdddgdfg而沒有getchar()調用)。因此,getchar()這裏將消耗所有那些 字符(每次迭代一次),最終您將能夠再次讀取int(使用%d)。

但是這一切都是真的不需要;這只是一個嘗試修復scanf()的缺陷。使用scanf()讀取輸入並將其更正爲確實困難。這就是爲什麼總是建議使用fgets()並使用sscanf()或使用strto*()函數解析,如果您只是掃描整數。

參見:Why does everyone say not to use scanf? What should I use instead?

+0

好點和結論。 – chux

1

在此代碼,getchar被稱爲用於其副作用:它從標準輸入讀取字符並拋出它扔掉。

可能這是從用戶那裏讀取輸入。 scanf將消耗一個數字,但在數字未改變之後保留換行符。 getchar消耗換行符並將其丟棄。這在此循環中不是必須的,因爲下一個scanf將跳過空白以查找下一個數字,但如果代碼之後循環不期望有換行符作爲第一個stdin上的東西。

此代碼是越野車,因爲它不檢查EOF,因爲當輸入一個數字或它不會做任何事情懂事時,有對數後的行更多的文字,因爲它使用scanf,這是指定的斷開(例如,如果輸入溢出的範圍爲int,則允許崩潰程序)。更好的代碼會像

char *linep = 0; 
size_t asize = 0; 
char *endp; 
long c; 
while (getline(&linep, &asize, stdin) > 0) { 
    errno = 0; 
    c = strtol(linep, &endp, 10); 
    if (linep == endp || *endp != '\0' || errno) { 
     puts("?Redo from start"); 
     continue; 
    } 
    if (c == 0) break; 
    do_something_with(c); 
} 
free(linep); 
0

getchar();僅僅是閱讀和數量後消費性格,無論是空格,逗號,新線路或其它整數或任何其他的開始。

IMO,這不是健壯的代碼。好的代碼將1)至少測試scanf()的結果和2)測試或限制以下字符的消耗,以防止「吃」下面數字的可能符號。記住代碼無法控制用戶輸入的內容,但必須處理輸入的內容。

v space 
"123 456" 

    v comma 
"123,456" 

    v negative sign 
"123-456"