K&R练习6-1在某些情况下,getword函数无法读取EOF

问题描述 投票:0回答:1

我刚完成本书C编程语言中的练习6.1,第二版(由[[K&R编写),这是练习问题:

我们的getword版本无法正确处理下划线,字符串常量,注释或预处理程序控制行。写一个更好的版本。

这是书中的getword函数:

int getword(char *word, int lim) { int c; char *w = word; while (isspace(c = getch())) ; if (c != EOF) *w++ = c; if (!isalpha(c)) { *w = '\0'; return c; } for ( ; --lim > 0; w++) if (!isalnum(*w = getch())) { ungetch(*w); break; } *w = '\0'; return word[0]; }

在main()中调用函数:

while (getword(word, MAXWORD) != EOF) {...}

这是我的getword函数:

int getword(char *word, int lim) { int c, c1; char *w = word; while (isspace(c = getch())) ; if (c != EOF) *w++ = c; else return EOF; // handle comments: /* */ if ( c == '/') { if ((c1 = getch()) == '*') { keytab[31].count++; int ok = 1; while (ok) { // skip characters in comment lines while ((c = getch()) != EOF || c != '*') ; if (c == EOF) return EOF; if ((c = getch()) == '/') ok = 0; } return COMMENT; } // handle comments : // else if (c1 == '/') { keytab[32].count++; while ((c = getch()) != EOF || c != '\n') ; if (c == EOF) return EOF; return COMMENT; } else return c; } // handle preprocessor control lines, start with '#' if (c == '#') { keytab[34].count++; while ((c = getch()) != EOF || c != '\n') ; if (c == EOF) return EOF; return '#'; } // handle string constants, " " else if (c == '\"') { while ((c1 = getch()) != EOF || c1 != '\"') ; if (c1 == EOF) return EOF; keytab[33].count++; return CONSTANT; } else if (c != '_' && !isalpha(c)) { while ((c = getch()) != EOF && !isspace(c)) ; if (c == EOF) return EOF; return NOT; } // c is '_' or letter , scan characters until EOF or space, or punctuation // to get a complete word for ( ; --lim > 0; w++) if ((*w = getch()) == EOF || isspace(*w) || ispunct(*w)) { ungetch(*w); break; } *w = '\0'; return WORD; }

如果不输入

/// *,代码将正常运行,并且可以通过enterint ctrl + d停止输入。但是一旦输入了上述字符之一,程序将无法读取EOF,因此无法停止输入。我通过gdb调试了程序,但仍然没有得到它。那么会发生什么呢?我刚刚完成了《 C编程语言,第二版》(由K&R撰写)一书中的练习6.1,这是练习问题:我们的getword版本无法正确处理下划线,字符串...
c eof
1个回答
0
投票
[&&||] >>

while ((c = getch()) != EOF || c != '*')

© www.soinside.com 2019 - 2024. All rights reserved.