2

我只是编程的初学者。我正在学习 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 个字符)。

我想知道为什么会这样?

4

2 回答 2

0

通常(在您的情况下)stdin是行缓冲的,因此您的程序不会在输入字符时接收字符,而是在用户输入换行符(Return)时或系统缓冲区已满时以块的形式接收.

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

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

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

于 2013-02-04T15:20:07.363 回答
0

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

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

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

希望我的回答能帮到你。

于 2013-02-04T15:28:43.580 回答