【问题标题】:Multiple input for running program运行程序的多个输入
【发布时间】:2016-04-14 15:01:59
【问题描述】:

我有以下 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 的权限,也不必更改代码。

任何帮助将不胜感激。

【问题讨论】:

  • 1.) 不要使用gets()。 2.) 尝试scanf("%64s", buf); 这可以防止缓冲区溢出。可能有更好的解决方案。只是我的第一个想法,您可以使用什么。
  • 谢谢,但我不必更改代码。
  • 您不想更改它?或者你不能?抱歉,我没有阅读有问题的最后一句话。但是我还是不明白是什么意思。对于我的第一个答案 - 这不是解决方案,只是一些提示。
  • @Enkeli scanf("%63s", buf);,而不是 scanf("%64s", buf);
  • @الطيب 你的问题是“如何让程序在管道数据结束后等待用户输入?”这样第一个gets 应该得到a 而第二个应该等待用户输入?

标签: c linux bash redirect pipe


【解决方案1】:

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

你的第二个gets 然后什么都不做(因为在 EOF 之后没有什么可读的),让buf 一个人呆着; buf 仍包含"a\0",已正式打印。

更多提示:

  • 在执行 I/O 时,可能会在任何时候固有地失败,您必须在每次调用后检查错误,否则会发生不好的事情。训练自己这样做并节省大量调试时间。

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

【讨论】:

  • buf 不包含换行符。
猜你喜欢
  • 1970-01-01
  • 2015-09-22
  • 2014-02-24
  • 2015-12-19
  • 2018-12-11
  • 2014-08-19
  • 2012-06-19
  • 2022-11-19
  • 1970-01-01
相关资源
最近更新 更多