我正在编写一个程序,在Linux终端上逐个字符地复制输入到输出。代码如下(来自Dennis Ritchie的C书)
#include <stdio.h>
/* copy input to output; 2nd version*/
main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
该程序及其执行工作正常。但我想稍作修改。
输出显示在每个新行字符的终端上(当我按下回车键时)。我想延迟输出,直到我通过按 Ctrl + D 发出信号结束信号。我必须对程序进行哪些修改才能在终端上延迟输出。
我得到的示例输出如下:
abcd (enter)
abcd
llefn;elnf(enter)
llefn;elnf
(ctrl+d)
我想得到的示例输出如下:
abcd(enter)
llefn;elnf(ctrl+d)
abcd
llefn;elnf
答案 0 :(得分:2)
您需要将这些字符存储到缓冲区,控制索引在哪里编写,当您收到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;
}
答案 1 :(得分:2)
一个简单的,虽然草率和部分解决方案是将stdout
配置为使用大缓冲区完全缓冲:
#include <stdio.h>
int main(void) {
int c;
setvbuf(stdout, NULL, _IOFBF, 32767);
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}
注意:
NULL
传递给setvbuf
,可以使用malloc()
分配缓冲区。答案 2 :(得分:1)
如上所述in the comments:将字符放入缓冲区并在结尾显示整个缓冲区:
#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
}
答案 3 :(得分:1)
您可以使用stdout
将缓冲区设置为setvbuf(3)
。
#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在评论中正确指出的那样,缓冲区的大小有限可能会导致程序突然吐出其内容的垃圾邮件。为了避免这种情况,可以跟踪缓冲区的利用率并在填充时扩展其大小。