gpt4 book ai didi

c - 理解 ungetc 在简单 getword 中的使用

转载 作者:行者123 更新时间:2023-11-30 14:24:09 25 4
gpt4 key购买 nike

我遇到过这样一个 getword 的例子。我了解所有检查等,但我对 ungetc 有疑问。

c满足if ((!isalpha(c)) || c == EOF)且不满足while (isalnum (c)) -> 它不是字母,也不是数字 - ungetc 拒绝该 char

假设它是'\n'

然后它返回单词,但是它无法返回,因为它没有保存在任何数组中。然后会发生什么?

    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 出于某种目的被拒绝,并且不会在无限循环中一次又一次满足条件?

最佳答案

在你不理解的行之前的终端条件不好。大概应该是:

int c;

...

if (!isalpha(c) && c != EOF)
ungetc(c, fp);

这意味着,如果最后读取的字符是真实字符(不是 EOF)并且不是字母字符,则将其推回以供接下来使用输入流 fp 的任何内容重新处理。也就是说,假设你读到的是空白;空白将终止循环,并且空白将被推回,以便下一个 getc(fp) 将再次读取空白(就像 fscanf() fread() 或文件流上的任何其他读取操作 fp)。如果你得到的是 EOF,而不是空白,那么在我修改后的代码中就不会尝试推回 EOF;在原始代码中,EOF 将被推回。

请注意,c 必须是 int 而不是 char

关于c - 理解 ungetc 在简单 getword 中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12166757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com