我遇到了这样一个getword的例子。 我理解所有的检查等等,但我有ungetc的问题。
当c
满足if ((!isalpha(c)) || c == EOF)
并且不满足while (isalnum(c))
时 - >它不是字母,也不是数字 - ungetc
拒绝char
。
我们假设它是'\n'
。
然后它到达return word
但是它不能被返回,因为它没有保存在任何数组中。那么会发生什么?
while (isalnum(c)) {
if (cur >= size) {
size += buf;
word = realloc(word, sizeof(char) * size);
}
word[cur] = c;
cur++;
c = fgetc(fp);
}
if ((!isalpha(c)) || c == EOF) {
ungetc(c, fp);
}
return word;
修改 @Mark Byers - 谢谢,但是c被拒绝了,并且无法在无限循环中一次又一次地满足条件?
答案 0 :(得分:1)
ungetc
将字符推送到流上,以便下次读取将再次返回该字符。
ungetc(c, fp); /* Push the character c onto the stream. */
/* ...etc... */
c = fgetc(fp); /* Reads the same value again. */
如果您正在阅读字符以查明当前令牌何时完成但尚未准备好读取下一个令牌,这有时会很方便。
答案 1 :(得分:1)
终点条件,就在您不理解的行之前,并不好。应该是:
int c;
...
if (!isalpha(c) && c != EOF)
ungetc(c, fp);
这意味着如果读取的最后一个字符是真实字符(不是EOF)并且不是字母字符,则将其推回以供下次使用输入流fp
的任何内容进行重新处理。也就是说,假设你读了一个空白;空白将终止循环,空白将被推回,以便下一个getc(fp)
将再次读取空白(如fscanf()
或fread()
或文件流上的任何其他读取操作fp
)。如果你有EOF,而不是空白,那么就没有尝试在修改后的代码中推回EOF;在原始代码中,EOF会被推回。
请注意c
必须是int
而不是char
。
答案 2 :(得分:0)
行。现在我理解为什么这种情况与例如。 '\n'
困扰着我。我只是愚蠢而忘记了main()
中引用getword的部分。当然在调用getword之前有几个测试(另一个ungetc
)和fputs
字符不满意isalnum
由此可见,while
中的getword
循环始终以至少一个isalnum
正数开头,而结尾处的检查仅适用于后续字符。