繁体   English   中英

在回车和putchar()之后执行会在循环中跳过getchar()?

[英]Execution skips getchar() in loop after carriage return and putchar()?

这是我第一次在这里发布信息,因此希望能按预期进行。

我正在做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岁儿童一样)。

当您键入东西并按Enter键时,所有内容都存储在内部缓冲区中。 因此,每次循环执行时,它都会到达getchar ,* 确实*转到该缓冲区并提取单个字符。

但是我不明白的是为什么执行不会在循环的每个后续迭代中停止

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM