C中的getchar()函数:为什么我使用getchar后不会打印字符?

时间:2013-02-04 14:19:26

标签: c input inputstream getchar

我只是编程的初学者。我正在学习K& R的书,C编程语言。在我读书的时候,我对这个问题变得越来越好奇 - 当有一个循环从输入中逐个获取字符时,我在循环中输出一个输出函数,我认为其结果就像在输入后立即打印每个字符。但是,结果似乎计算机只会在点击一个键后打印出整个字符包。

例如K& R的书中练习1-22的回答:

/* K&R Exercise 1-22 p.34 
 *
 * Write a program to "fold" long input lines into two or more
 * shorter lines after the last non-blank character that occurs before the n-th
 * column of input.  Make sure your program does something intelligent with very
 * long lines, and if there are no blanks or tabs before the specified column.
 */

#include <stdio.h>

#define LINE_LENGTH 80
#define TAB '\t'
#define SPACE ' '
#define NEWLINE '\n'

void entab(int);

int main()
{
    int i, j, c;
    int n = -1;     /* The last column with a space. */
    char buff[LINE_LENGTH + 1];

    for ( i=0; (c = getchar()) != EOF; ++i )
    {
        /* Save the SPACE to the buffer. */
        if ( c == SPACE )
        {
            buff[i] = c;
        }
        /* Save the character to the buffer and note its position. */ 
        else
        {
            n = i;
            buff[i] = c;
        }

        /* Print the line and reset counts if a NEWLINE is encountered. */
        if ( c == NEWLINE )
        {
            buff[i+1] = '\0';
            printf("%s", buff);

            n = -1;
            i = -1;
        }
        /* If the LINE_LENGTH was reached instead, then print up to the last
         * non-space character. */
        else if ( i == LINE_LENGTH - 1 )
        {
            buff[n+1] = '\0';
            printf("%s\n", buff);

            n = -1;
            i = -1;
        }
    }
}

我认为程序结果会是这样,它只打印出一行字符,长度为80,就在我输入80个字符后(我还没有点击ENTER键)。但是,它不会出现这种情况!无论有多少个字符,我都可以完全输入整个字符串。当我最终决定完成该行时,我只需点击ENTER键,它将给我正确的输出:长字符串被切成几个短片/行,有80个字符(当然最后一个可能包含更少超过80个字符)。

我想知道为什么会这样?

2 个答案:

答案 0 :(得分:0)

通常(在您的情况下),stdin是行缓冲的,因此您的程序在键入时不会收到字符,但是在用户输入换行符时会收到块(返回),或者,当系统缓冲区已满时。

因此,当用户输入最终发送到您的程序时,它将被复制到程序的输入缓冲区中。这就是getchar()读取字符以填充buff的地方。

如果输入足够长,buff将从输入缓冲区填充LINE_LENGTH个字符,然后打印几次(直到输入缓冲区的全部内容都被消耗完)。

在Linux上(通常在Unix-ish系统上,但我不确定),您也可以通过键入 Ctrl + D将输入发送到程序而无需输入换行符在非空行上(作为行上的第一个输入,关闭stdin;在输入行的稍后一点,您可以通过键入两次来关闭stdin),因此,如果在输入LINE_LENGTH [或更多]字符后输入 Ctrl + D 而没有换行符,[至少输入的初始部分]将立即打印输入然后

答案 1 :(得分:0)

我很高兴见到你,因为我也来自中国。实际上,我的英语很差。而且,我也是编程的初学者。所以,我不太了解你的目的。

但是,我发现您的代码存在问题。循环可能不会停止。 EOF是文件的末尾,但您没有打开任何文件。

我对getchar()的了解是获得黄油缓存的标准输入。 getchar()通常用于停止输入(或循环)。

我希望我的回答可以帮到你。