C:为什么"输入"这段代码中的键触发输出?

时间:2016-11-05 22:39:47

标签: c

这是我在C#编程语言中的练习1-13的代码":

#include <stdio.h>

int main()
{
    int c, currentIndex, currentLength;

    currentLength = currentIndex = 0;

    while ((c = getchar()) != EOF){
        if (c == '\t' || c == '\n' || c == ' '){
            if (currentLength == 0){
                continue;
            }

            printf("Length of word %d: ||", currentIndex);

            for (int i = 0; i < currentLength; i++){
                putchar('-');
            }
            putchar('\n');

            currentLength = 0;
            ++currentIndex; 
        } else {
            ++currentLength;
        }   
    }

    return 0;
}

所以我可以编译它并使用./a.out运行它,但是当我按下#34;输入&#34;要开始一个新的输入行(&#39; \ n&#39;)它会运行printf()和putchar()函数(而不是&#39;&#39;或&#39; \ t&#39;触发输出)。 while循环不会结束(它以END-OF-FILE(CTRL-D)结束)但我想知道为什么这些函数在被调用时会被调用。它可以防止一次输入多行。这是它的输出示例:

    how long are these words
    Length of word 0: ||---
    Length of word 1: ||----
    Length of word 2: ||---
    Length of word 3: ||-----
    Length of word 4: ||-----

为了清楚起见,当我按下#34;输入&#34;时,我只能从printf()和putchar()获取输出。 CTRL-D只是结束循环和程序。

3 个答案:

答案 0 :(得分:1)

默认情况下,

mysql处于缓冲模式,因此在按下enter之前,不会向您的程序提供字符。这个问题重复:How to avoid press enter with any getchar()

答案 1 :(得分:0)

ENTER释放缓冲区。

直到ENTER,您的代码无法获得数据。您的代码会同时获取所有字符。

操作系统负责维护缓冲区(您可能可以更改操作系统的这一方面)。

答案 2 :(得分:0)

在c中,任何输出(除非另有特别设置)都是缓冲的。

在发生以下任何一种情况之前,不会输出任何内容:

  1. fflush()被称为
  2. 输出'\ n'
  3. 缓冲区已填满。
  4. 因此,您可以在调用flush()

    后向printf()添加电话

    注意:除了标签,空格,换行符之外,还有其他一些单词分隔符可供您查找。

    建议添加:单引号,双引号,句号,冒号,分号,左键,左括号,右键,右括号,后拨。