【问题标题】:Execution skips getchar() in loop after carriage return and putchar()?在回车和putchar()之后执行跳过getchar()循环?
【发布时间】:2012-11-29 08:07:49
【问题描述】:

这是我第一次在这里发帖,所以希望一切顺利。

我正在做 K&R 的早期练习之一。目标是使用 getchar() 从用户那里获取一堆字符,然后使用 putchar() 打印它们,但跳过任何额外的空格。我的练习解决方案效果很好,但我不明白为什么。

这是程序:

#include <stdio.h>

int main()
{
    int c, spc;
    c = 0;
    spc = 0;

    while(c != EOF)
    {
        c = getchar();

        if(c == ' ')
        {
            if(spc != 1)
            {
                putchar(c);
                spc = 1;
            }
        }
        if(c != ' ')
        {
            spc = 0;
            putchar(c);
        }
    }
    return 0;
}

只有一个循环,执行在第一次迭代中按预期命中 getchar() 时停止。一旦按下回车,程序就会继续打印出用户在缓冲区中输入的任何内容,没有多余的空格——这正是它应该做的。

但我不明白的是,为什么在遇到 getchar() 时,循环的每次后续迭代都不会停止执行。 /n 字符是否与它有关?我确实注意到它还会打印换行符,并且在打印完所有内容后,它会再次在 getchar() 处停止。那么,为什么它会在每次迭代开始时跳过 getchar() 而打印缓冲区中的所有内容?

我一直在玩弄 C,但直到最近才努力以“正确”的方式学习它。由于我有一些经验,所以您不必过多地回答问题(所以,就像您向 10 岁而不是 5 岁的孩子解释它一样)。

【问题讨论】:

    标签: c


    【解决方案1】:

    当您输入内容并按下回车键时,所有内容都存储在内部缓冲区中。所以每次循环执行时,它都会命中getchar,谁 ** 去那个缓冲区并拉出一个字符。

    但我不明白为什么每次执行都不会停止 循环的后续迭代

    仅当getchar 在该缓冲区中找不到任何内容时,程序才会停止。 现在\n 在这种情况下没有什么特别的。这只是 CLI 实际上不会将您键入的内容“发送”到程序的约定,直到您按回车键(即您可以按退格键等)。

    【讨论】:

    • 那么,你的意思是只有在发送回车后才会调用 getchar() ?这是有道理的 - getchar() 正在从缓冲区中抓取下一个字符,每次循环迭代一个字符,而 putchar() 正在将它们放下。我理解正确吗?
    • @Regz 非常准确,是的。但我会说它:getchar 被调用,它阻塞,你输入一个字符串然后你回车。现在getchar 解除阻塞,后续调用也不会阻塞。
    【解决方案2】:

    while (c != EOF) 在点击EOF 后结束。输入一些内容后尝试按Ctrl + D。

    【讨论】:

    • 谢谢,但这不是我的问题。我了解 EOF 是什么,也了解我的 while 循环。我只是不明白 getchar() 是如何在幕后工作的。不过,我不知道我可以 Ctrl + D 来处理 EOF,所以谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多