首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解ungetc在简单getword中的使用

理解ungetc在简单getword中的使用
EN

Stack Overflow用户
提问于 2012-08-28 20:05:58
回答 3查看 817关注 0票数 0

我遇到过这样的一个例子。我理解所有的支票等等,但我对ungetc有一个问题。

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

让我们假设它是'\n'

然后它到达return word,但是它不能返回,因为它没有保存在任何数组中。然后会发生什么呢?

代码语言:javascript
复制
    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出于某种目的被拒绝了,并且不会在无限循环中一次又一次地满足这个条件?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-28 20:11:33

终端状态,就在你不明白的线路之前,是不好的。可能应该是:

代码语言:javascript
复制
int c;

...

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

这意味着,如果最后读取的字符是真正的字符(不是EOF),而不是字母字符,那么无论接下来使用输入流fp,都可以将其推回以进行再处理。也就是说,假设您读取了一个空白;空白将终止循环,空白将被推回,以便下一个getc(fp)将再次读取空白( fscanf()fread()或文件流fp上的任何其他读取操作也是如此)。如果不是空白,而是EOF,那么在我修改过的代码中没有尝试将EOF向后推;在原始代码中,EOF将被推回。

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

票数 1
EN

Stack Overflow用户

发布于 2012-08-28 20:09:49

ungetc将字符推入流中,以便下一次读取将再次返回该字符。

代码语言:javascript
复制
ungetc(c, fp);  /* Push the character c onto the stream. */
/* ...etc... */
c = fgetc(fp);  /* Reads the same value again. */

如果您正在读取字符以找出当前令牌何时完成,但还没有准备好读取下一个令牌,这有时是很方便的。

票数 1
EN

Stack Overflow用户

发布于 2012-08-28 20:47:08

好的。现在我明白为什么会有这样的情况了。'\n'在烦我。我只是哑口无言,忘记了main()中提到getword的部分。当然,在调用getword之前,有几个测试(另一个ungetc在那里),并且fputs (字符不是讽刺的isalnum )--从这里可以看出,getword中的while循环总是以至少一个isalnum +开头,并且在结尾处的检查只是为了下面的字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12166757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档