我只是编程的初学者。我正在学习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个字符)。
我想知道为什么会这样?
答案 0 :(得分:0)
通常(在您的情况下),stdin
是行缓冲的,因此您的程序在键入时不会收到字符,但是在用户输入换行符时会收到块(返回),或者,当系统缓冲区已满时。
因此,当用户输入最终发送到您的程序时,它将被复制到程序的输入缓冲区中。这就是getchar()
读取字符以填充buff
的地方。
如果输入足够长,buff
将从输入缓冲区填充LINE_LENGTH
个字符,然后打印几次(直到输入缓冲区的全部内容都被消耗完)。
在Linux上(通常在Unix-ish系统上,但我不确定),您也可以通过键入 Ctrl + D将输入发送到程序而无需输入换行符在非空行上(作为行上的第一个输入,关闭stdin
;在输入行的稍后一点,您可以通过键入两次来关闭stdin
),因此,如果在输入LINE_LENGTH
[或更多]字符后输入 Ctrl + D 而没有换行符,[至少输入的初始部分]将立即打印输入然后
答案 1 :(得分:0)
我很高兴见到你,因为我也来自中国。实际上,我的英语很差。而且,我也是编程的初学者。所以,我不太了解你的目的。
但是,我发现您的代码存在问题。循环可能不会停止。 EOF是文件的末尾,但您没有打开任何文件。
我对getchar()的了解是获得黄油缓存的标准输入。 getchar()通常用于停止输入(或循环)。
我希望我的回答可以帮到你。