2

这是我第一次在这里发帖,所以希望这能按预期进行。

我正在做 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 岁的孩子解释它一样)。

4

2 回答 2

4

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

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

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

于 2012-11-29T08:10:51.503 回答
0

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

于 2012-11-29T11:13:26.117 回答