2016-04-14 90 views
0

多输入我有以下的C程序:运行程序

#include<stdio.h> 
main() 
{ 
    char buf[64]; 
    gets(buf); 
    printf("Your input: %s\n", buf); 
    gets(buf); 
    printf("Your input: %s\n", buf); 
} 

我想将数据发送到使用管道或重定向程序。问题在于程序不会等待第二个输入新数据。

e.g

$ echo "a" | ./test 

输出:

Your input: a 
Your input: a 

如何发送让程序等待在每个用户输入使用管道或重定向得到。 P.S我没有持续写入/ proc/$ pid/fd/0,我不必更改代码。

任何帮助,将不胜感激。

+1

1.)不要使用'gets()'。 2.)尝试'scanf(“%64s”,buf);' 这可以防止缓冲区溢出。可能有更好的解决方案。只是我的第一个想法,你可以使用。 – Enkelli

+0

谢谢,但我不必更改代码。 –

+0

你不想改变它吗?或者你不能?对不起,我没有读到最后一句话。但我仍然不明白这意味着什么。 我的第一个答案 - 这不是解决方案,只是一些提示。 – Enkelli

回答

0

如果您使用管道|将数据输入到命令,它会从终端的(输入部分)断开连接。 gets读取第一行"a\n"并将其作为"a\0"写入buf。然后它碰到管道的末端,或EOF(文件的结尾)。

你的第二个gets然后什么都不做(因为在EOF之后没有东西要读)并且让buf独自一人; buf仍然包含"a\0",这是正式印刷。

进一步提示:

  • 在做I/O,可本质上在任何时候失败了,你必须在每个调用后检查错误,还是坏的事情会发生。训练自己做到这一点,并节省大量的调试时间。

  • 永远不要做像gets(buf)这样的I/O,因为它会导致缓冲区溢出,这是计算安全性的祸害。如果输入任意数据,则必须使用可以限制写入字节数的调用。 gets的手册页在顶部包含句子“从不使用此功能”。你可以找到其他更好的函数,read是一个基线,如果你使用C++,会有很多其他的标准解决方案。

+0

'buf'不包含换行符。 –

+0

是的,我已经清除了。 – AnoE