将输入发送到C程序并打印它们

将输入发送到C程序并打印它们,c,bash,input,scanf,C,Bash,Input,Scanf,尝试编写一个脚本,获取一个输入文件,并在程序请求输入时将其逐个发送到C程序(scanf)。 我希望我的脚本在发送到程序之前打印每个输入。 C程序的整个输出(包括我提供的输入)应该打印到一个文件中 寻找一个解决方案而不改变我的C代码 例如: 我的C程序:test.C #include <stdio.h> int main() { char a[50]; int b; printf("Enter your name:\n"); scanf("%s",a)

尝试编写一个脚本,获取一个输入文件,并在程序请求输入时将其逐个发送到C程序(scanf)。 我希望我的脚本在发送到程序之前打印每个输入。 C程序的整个输出(包括我提供的输入)应该打印到一个文件中

寻找一个解决方案而不改变我的C代码

例如:

我的C程序:test.C

#include <stdio.h>

int main()
{
    char a[50];
    int b;
    printf("Enter your name:\n");
    scanf("%s",a);
    printf("HELLO: %s\n\n", a);
    printf("Enter your age:\n");
    scanf("%d",&b);
    printf("Your age is: %d\n\n", b);
    return 0;
}
我也试过了

#!/bin/bash
gcc test.c -o mytest
./mytest < input > outputfile
我的输出文件:outputfile

Enter your name:
HELLO: Itzik

Enter your age:
Your age is: 25
所需输出文件:

Enter your name:
Itzik
HELLO: Itzik

Enter your age:
25
Your age is: 25

非常感谢

如果不编写一个程序来解析test.c的输出,并知道什么是输入提示,什么不是,那么您所要求的实际上是不可能的

根据您的程序的复杂程度,您可能有幸使用
聊天
程序(请参阅
男士聊天
)或GNU expect

正如“BobRun”所说,你最好的选择是修改你的程序。无论您多么不想修改您的程序,现在都应该将您可能在代码中乱扔的所有
scanf()
放在适当的输入函数后面,如:

int input_int(const char *prompt)
{
   printf ("%s:\n", prompt)
   int i = 0;
   scanf("%d", &i);

   /* Eat rest of line */
   int ch;
   do 
     ch = fgetc(stdin);
   while (ch != '\n' && ch != EOF)

   return i;
}
现在,添加错误检查和输入回显变得微不足道。您的程序可能会变得更容易阅读

消除即将发生的bug/security漏洞
scanf(“%s”,…)
也将变得很容易


如果你认为这是一项艰巨的任务,那就接受吧。你真的应该在工作很小的时候就开始做。如果你再耽搁工作,很快就会是胡蒙格斯。

哦,天哪。。这会有点难看

您可以在后台启动程序,让它从管道中读取数据,然后劫持该管道并向其写入数据,但仅当程序正在等待输入时。在写入管道之前,先写入标准输出

#在后台启动程序
#
#tail命令永远挂起,不会产生输出,因此
#prog将等待。
tail-f/dev/null |/prog&
#捕获两个进程的PID
PROGPID=$!
TAILPID=$(作业-p%+)
#劫持管道的写入端(标准的out-of-tail命令)。
#之后,可以终止tail命令。
exec 3>/proc/$TAILPID/fd/1
杀死$TAILPID
#现在从我们自己的标准输入中逐行读取
而IFS=读取-r行
做
#检查程序的状态。。。我们在它运行时等待。更多
#prog以外的复杂程序可能会进入您需要的其他状态
#需要照顾!
状态=$(ps--无标题-wwo统计-p$PROGPID)
而[[“x$state”==xR*]]
做
睡眠0.01
状态=$(ps--无标题-wwo统计-p$PROGPID)
完成
#现在prog正在等待输入。显示我们的线路,然后发送
#它需要进步。
回音$线
echo$line>&3
完成
#关上管子
执行官3>&-
我已将上述源代码编译成名为
prog
的可执行文件,并将上述代码保存到
pibs.sh
中。结果是:

$ bash pibs.sh < input 
Enter your name:
Daniel
HELLO: Daniel

Enter your age:
29
Your age is: 29

$bash pibs.sh
如果您只想重复输入的内容,这将执行以下操作:printf(“%s\n错误:%s\n\n”,a,a);printf(“%d\n您的年龄是:%d\n\n”,b,b);我根本不想更改我的C代码。另外,我有很多输入,所以检查C代码中的每个printf实际上是不实际的。为什么不想更改C代码?你只需要在Hello和your age之前打印姓名和年龄,我这里只给出了一个例子,我的C代码很大…听起来你想要一个expect脚本。我如何编辑你的代码,使输出不会进入终端屏幕,而是进入一个文件?
bash pibs.shoutput
应该可以工作。。或
>
而不是
进行附加
int input_int(const char *prompt)
{
   printf ("%s:\n", prompt)
   int i = 0;
   scanf("%d", &i);

   /* Eat rest of line */
   int ch;
   do 
     ch = fgetc(stdin);
   while (ch != '\n' && ch != EOF)

   return i;
}
$ bash pibs.sh < input 
Enter your name:
Daniel
HELLO: Daniel

Enter your age:
29
Your age is: 29