将输出延迟到EOF而不是换行

我正在编写一个程序,将input复制到Linuxterminal上逐字输出。 代码如下(来自Dennis Ritchie的C书)

#include <stdio.h> /* copy input to output; 2nd version*/ main() { int c; while ((c = getchar()) != EOF) putchar(c); } 

程序及其执行效果很好。 但我想稍作修改。

输出显示在每个新行字符的terminal(当我按下input)。 我想延迟输出,直到我按Ctrl + D发信号结束文件。 为了延迟我在terminal上的输出,我必须对程序做些什么修改。

我得到的示例输出如下所示:

 abcd (enter) abcd llefn;elnf(enter) llefn;elnf (ctrl+d) 

我想要得到的示例输出如下所示:

 abcd(enter) llefn;elnf(ctrl+d) abcd llefn;elnf 

您需要将这些字符存储到缓冲区, 控制索引在哪里写入 ,何时接收EOF只需通过printf打印该缓冲区。

如果你不能解决它,你可以在这里启发

 #include <stdio.h> #define BUFFER_SIZE 1024 int main() { int c, i = 0; char buffer[BUFFER_SIZE]; while ((c = getchar()) != EOF) { if (i < BUFFER_SIZE - 1) { buffer[i] = c; i++; } else { buffer[BUFFER_SIZE - 1] = '\0'; printf("%s", buffer); i = 0; } } buffer[i] = '\0'; printf("%s", buffer); return 0; } 

一个简单但部分的解决方案是将stdout配置为使用大缓冲区进行完全缓冲:

 #include <stdio.h> int main(void) { int c; setvbuf(stdout, NULL, _IOFBF, 32767); while ((c = getchar()) != EOF) { putchar(c); } return 0; } 

笔记:

  • 在32位或64位系统上,可以使缓冲区变得非常大。
  • 传递NULLsetvbuf让它用malloc()分配缓冲区。

正如在评论中已经提到的那样 :将字符放入一个缓冲区并在最后显示整个缓冲区:

  #include <stdio.h> #define BUF_SIZE 1024 int main() { char str[BUF_SIZE]; // the buffer int c, i = 0; while (i < BUF_SIZE-1 && (c = getchar()) != EOF) str[i++] = (char) c; str[i] = '\0'; printf("%s\n", str); // display the contents of the buffer } 

您可以使用setvbuf(3)将缓冲区设置为stdout

 #include <stdio.h> main() { int c; char buf[BUFSIZ]; setvbuf(stdout,buf,_IOFBF,BUFSIZ); while ((c=getchar())!=EOF) putchar(c); } 

这里的关键是使用_IOFBF常量指定的完全缓冲模式。 缓冲区的大小设置为BUFSIZ ,通常等于8192。

正如乔纳森·莱弗勒(Jonathan Leffler)的评论所指出的那样,缓冲区的大小有可能会导致程序突然吐出垃圾终端的内容。 为了避免这种情况,可以跟踪缓冲区的使用情况,并在缓冲区填满时扩展其大小。