這是我在Stack Overflow上的第一篇文章,所以我希望我不要踩在任何人的腳趾上。K&R:第6章 - 爲什麼getword()函數不讀取EOF?
當然,所有的輸入都是受歡迎和讚賞的,但那些最適合回答的人實際上已經閱讀了這本書,其中第二版的編程語言爲。
我剛剛完成了練習6-4的編碼,但我似乎無法弄清楚什麼。爲什麼getword()函數沒有讀取EOF,直到我按下Ctrl + D(我在Arch Linux VM中的C代碼)?
我以前的許多練習都需要從stdin中讀取。我會做的一種方式是通過類似於
while ((c = getchar()) != EOF) {...}
在這種情況下,我從來不必按Ctrl + D。我輸入我的輸入內容,按Enter鍵,stdin緩衝區被刷新,並自動檢測到EOF。 getword()函數也在其基礎上依賴於getchar(),所以它爲什麼會掛起我的程序?
屏幕取詞()函數被稱爲主():
while (getword(word, MAX_WORD) != EOF) {
if (isalpha(word[0])) {
root = addtree(root, word);
}
}
屏幕取詞()函數本身:
int getword(char *word, int lim) {
char *w = word;
int c;
while (isspace(c = getch())) {
}
if (c != EOF) {
*w++ = c;
}
// This point is reached
if (!isalpha(c)) {
// This point is never reached before Ctrl+D
*w = '\0';
return c;
}
for (; --lim > 0; w++) {
if (!isalnum(*w = getch())) {
ungetch(*w);
break;
}
}
*w = '\0';
return word[0];
}
我把話來表明,我確定EOF是點不被閱讀。
的函數getch()和ungetch()函數是從第4章中的波蘭表示法計算器所使用的相同的那些(和該程序能夠自動讀取EOF - 通過按回車):
#define BUF_SIZE 100
char buf[BUF_SIZE];
int bufp = 0;
int getch(void) {
return (bufp > 0) ? buf[--bufp] : getchar();
}
void ungetch(int c) {
if (bufp >= BUF_SIZE) {
printf("ungetch: too many characters\n");
}
else {
buf[bufp++] = c;
}
}
因此很遠,這是自本書開始以來我寫的第一個程序,它要求我通過Ctrl + D手動輸入EOF。我似乎無法弄清楚爲什麼。提前說明
大部分升值......
要格式化代碼,請突出顯示它,然後單擊「{}」圖標。這會使突出顯示的區域縮進4個空格,這就是「降價」表示源代碼的方式。另請參閱[編輯幫助頁面](http://stackoverflow.com/editing-help)。我已經爲你修好了。歡迎來到Stackoverflow! – 2011-12-15 02:49:19