我只是問在這段代碼中getchar做了什麼,它是如何工作的?我不明白爲什麼getchar會影響代碼,對我來說,好像它只是獲取值,但沒有任何值正在完成。C代碼,scanf和getchar
int c=0;
while (c>=0)
{
scanf("%d", &c);
getchar();
}
我只是問在這段代碼中getchar做了什麼,它是如何工作的?我不明白爲什麼getchar會影響代碼,對我來說,好像它只是獲取值,但沒有任何值正在完成。C代碼,scanf和getchar
int c=0;
while (c>=0)
{
scanf("%d", &c);
getchar();
}
最有可能的代碼是閱讀一個整數列表,用一個新行分隔。
scanf將讀取一個整數,並將其放入變量c中。
的getchar函數正在讀取下一個字符(假設新行)
因爲它不檢查,存在一些潛在的,這不是一個新行,或scanf函數失敗,因爲該是什麼試圖讀取不是一個數字。爲什麼getchar()
可能一直使用的
一些可能性:如果它這樣做忽略空格)
1)(與%c
掃描字符時通常使用的,這不是在這裏需要的,因爲%d
忽略空格呢。
2)另一種可能性是,後這個循環中,一些進一步的掃描完成,其中最後調用剩下最後\n
到scanf()
可能是一個問題。因此,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?
好點和結論。 – chux
在此代碼,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);
getchar();
僅僅是閱讀和數量後消費性格,無論是空格,逗號,新線路或其它整數或任何其他的開始。
IMO,這不是健壯的代碼。好的代碼將1)至少測試scanf()
的結果和2)測試或限制以下字符的消耗,以防止「吃」下面數字的可能符號。記住代碼無法控制用戶輸入的內容,但必須處理輸入的內容。
v space
"123 456"
v comma
"123,456"
v negative sign
"123-456"
提示:嘗試使用'char'類型。在這裏,這是多餘的。 –
完美謝謝 – james