【问题标题】:Using a getchar() while loop; but, results are kinda strange使用 getchar() while 循环;但是,结果有点奇怪
【发布时间】:2012-11-27 20:49:43
【问题描述】:

我正在学习“C 编程语言”(K&R),并做了一个练习。练习是打印直到 EOF 之前的空格、制表符和换行符的数量。太好了,这行得通。但是,我开始变得聪明,并添加了您在下面看到的 printf(),实际上是“空格”或“制表符”或“换行符”。它应该在我输入时打印出来,但是,while 循环似乎只有在我按 Enter 后才会运行。

代码:

#include <stdio.h>

int main(int argc, const char * argv[])
{

    int c, nb, nt, nl;

    nb = nt = nl = 0;

    while ((c = getchar()) != EOF) {
        if (c == ' ') {
            nb += 1;
            printf("Space\n");
        }
        if (c == '\t') {
            nt += 1;
            printf("Tab\n");
        }
        if (c == '\n') {
            nl += 1;
            printf("New Line\n");
        }

    }

    printf("%d spaces, %d tabs, %d newlines",nb,nt,nl);

    return 0;
}

输出:

a b
Space
New Line
c d e
Space
Space
New Line
f   g
Tab
New Line
3 spaces, 1 tabs, 3 newlines

我期望看到的更像是这样的:

a Spaceb
New Line
c Spaced Spacee
New Line
f   tabg
New Line
3 spaces, 1 tabs, 3 newlines

那么,为什么我得到的是我得到的,而不是我期望的?

而且,是的,如果我真的关心的话,我会使用“空格[s]”、“制表符[s]”和“换行符[s]”这两个词的复数,而不是基于值,但是,它是只是一个练习。 ;)

【问题讨论】:

  • stdin 通常是行缓冲的,因此终端在输入换行符之前不会将输入发送到您的程序。
  • 谢谢..我认为这可能会发生...但是,如何使标准输入不被行缓冲?所以我可以实时处理击键?

标签: c


【解决方案1】:

您的终端处于规范模式 - 字符会累积到行尾。只有这样它们才会发送给用户(一个接一个)。

如果要立即响应,则必须将终端切换到原始模式。

PS。或多或少,像这样:

struct termios t;

tcgetattr (0, &t);

t.c_lflag &= ~ICANON;
t.c_cc [VMIN] = 1;
t.c_cc [VTIME] = 0;

tcsetattr (0, TCSANOW, &t);

【讨论】:

  • 必须添加:#include 但是,否则,按预期工作。谢谢!
猜你喜欢
  • 2017-05-19
  • 2012-07-10
  • 2017-04-04
  • 2021-07-18
  • 2011-02-02
  • 1970-01-01
  • 2015-06-04
  • 2015-10-09
  • 1970-01-01
相关资源
最近更新 更多