我遇到过这样的一个例子。我理解所有的支票等等,但我对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 -谢谢,但是那个c出于某种目的被拒绝了,并且不会在无限循环中一次又一次地满足这个条件?
发布于 2012-08-28 20:11:33
终端状态,就在你不明白的线路之前,是不好的。可能应该是:
int c;
...
if (!isalpha(c) && c != EOF)
ungetc(c, fp);这意味着,如果最后读取的字符是真正的字符(不是EOF),而不是字母字符,那么无论接下来使用输入流fp,都可以将其推回以进行再处理。也就是说,假设您读取了一个空白;空白将终止循环,空白将被推回,以便下一个getc(fp)将再次读取空白( fscanf()或fread()或文件流fp上的任何其他读取操作也是如此)。如果不是空白,而是EOF,那么在我修改过的代码中没有尝试将EOF向后推;在原始代码中,EOF将被推回。
注意,c必须是int而不是char。
发布于 2012-08-28 20:09:49
ungetc将字符推入流中,以便下一次读取将再次返回该字符。
ungetc(c, fp); /* Push the character c onto the stream. */
/* ...etc... */
c = fgetc(fp); /* Reads the same value again. */如果您正在读取字符以找出当前令牌何时完成,但还没有准备好读取下一个令牌,这有时是很方便的。
发布于 2012-08-28 20:47:08
好的。现在我明白为什么会有这样的情况了。'\n'在烦我。我只是哑口无言,忘记了main()中提到getword的部分。当然,在调用getword之前,有几个测试(另一个ungetc在那里),并且fputs (字符不是讽刺的isalnum )--从这里可以看出,getword中的while循环总是以至少一个isalnum +开头,并且在结尾处的检查只是为了下面的字符。
https://stackoverflow.com/questions/12166757
复制相似问题