我有以下C程序:
#include<stdio.h>
main()
{
char buf[64];
gets(buf);
printf("Your input: %s\n", buf);
gets(buf);
printf("Your input: %s\n", buf);
}
我想使用管道或重定向将数据发送到程序。问题是程序不会等待第二次获取输入新数据。
例如
$ echo "a" | ./test
输出:
Your input: a
Your input: a
如何使用管道或重定向发送让程序等待每个用户输入。 P.S我没有写入/ proc / $ pid / fd / 0的延迟,我不必更改代码。
任何帮助都将不胜感激。
答案 0 :(得分:0)
如果使用管道|
将数据输入到命令,则它将与终端的(输入部分)断开连接。 gets
读取第一行"a\n"
并将其作为buf
写入"a\0"
。然后它会到达管道末端或EOF(文件末尾)。
你的第二个gets
然后什么也没做(因为在EOF之后没有什么可读的)并且只允许buf
; buf
仍然包含"a\0"
,已正式打印。
进一步提示:
在进行I / O操作时,您可能会在任何时候内在地失败,您必须在每次通话后检查错误,否则会发生错误。训练自己这样做,节省大量的调试时间。
永远不要像gets(buf)
那样执行I / O,因为它会导致缓冲区溢出,这是计算安全性的祸根。如果输入任意数据,则必须使用允许限制写入字节数的调用。 gets
的手册页包含句子&#34;从不使用此功能&#34;在顶部。您可以找到其他更好的函数,read
作为基线,如果您使用的是C ++,那么还有很多其他标准解决方案。