これはスタックオーバーフローに関する私の最初の投稿です。だから私は誰の足元にも足を踏み入れていないことを願っています。もちろんK&R:第6章 - getword()関数がEOFを読み込まないのはなぜですか?
は、すべての入力は歓迎と感謝しているが、その答えに最も適したものが実際に持っている書籍、プログラミング言語C第2版を読んでいました。
は、私はちょうど練習6-4のコーディングが終了したが、私は何かを把握するように見えることはできません。 Ctrl + D(Arch Linux VMでC言語でコード化)を押すまで、getword()関数がEOFを読み込まないのはなぜですか?本からの私の前の演習の
多くは、標準入力からの読み込みが必要です。私がやる方法の1つは、
while ((c = getchar()) != EOF) {...}
です。このような場合、Ctrl + Dを押す必要はありません。入力した内容を入力してEnterキーを押すと、stdinバッファがフラッシュされ、EOFが自動的に検出されます。 getword()関数もgetchar()をベースにしているので、なぜプログラムがハングしますか?
getword()関数から呼び出される)(メイン:
while (getword(word, MAX_WORD) != EOF) {
if (isalpha(word[0])) {
root = addtree(root, word);
}
}
getword()関数自体:私はEOFであると判定点を示すために、コメントを入れ
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];
}
読まれていない。
getchは()とungetch()関数は、第4章からポーランド記法の計算で使用したのと同じものである(そのプログラムが自動的にEOFを読み取ることができた - Enterキーを押して):
#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つのスペースでインデントします。これは、 "markdown"がソースコードをどのように示しているかを示します。 [編集ヘルプページ](http://stackoverflow.com/editing-help)も参照してください。私はあなたのためにそれを修正しました。そして、Stackoverflowへようこそ! –