假设我有一个C程序,它具有以下结构,并且执行以下操作:
#include <stdio.h>
#include <string.h>
int afunction(char *arg) {
if (strcmp(arg, "something") == 0) {
return 1;
} else {
return 0;
}
}
int main(int argc, char *argv[]) {
char ans = 'n';
if (afunction(argv[1])) {
printf("The value of your entered parameter was \"something\" \n");
} else {
printf("The value of your entered parameter was not \"something\" \n");
printf("Do you wish to try again? (y/N) ");
ans = getchar();
if (ans == 'y') printf("Your answer was y");
// If this program wasn't a mock up, relevant code to restart would be added.
}
return 0;
}
如果我手动运行它,它将起作用:
foo@test:~$./myprogram goo
The value of your entered parameter was not "something"
Do you wish to try again? (y/N) y
Your answer was y
foo@test:~$
但是,如果我通过管道输入,则无法打印“您的答案是y”。即对于以下所有条件:
foo@test:~$echo 'y' | ./myprogram requiredparameter
foo@test:~$echo 'y/n' | ./myprogram requiredparameter
foo@test:~$yes | ./myprogram requiredparameter
foo@test:~$printf 'y/n' | ./myprogram requiredparameter
foo@test:~$printf 'y' | ./myprogram requiredparameter
foo@test:~$./myprogram requiredparameter <<< echo 'y'
foo@test:~$./myprogram requiredparameter <<< echo 'y/n'
foo@test:~$./myprogram requiredparameter <<< printf 'y'
foo@test:~$./myprogram requiredparameter <<< printf 'y/n'
我的回报是:
The value of your entered parameter was not "something"
Do you wish to try again? (y/N) foo@test:~$
因此,我没有正确地通过管道传递输入,因此该程序自动退出,因为它使用了ans
的默认值'n'
。这些方法为什么不起作用?如何通过管道将输入输入到提示?
编辑:为清楚起见。
EDIT2:requiredparameter
所做的事情与问题无关,但可执行文件运行是必需的(我认为这引起了不必要的混乱)。另外,默认情况下,ans = 'n'
应该由我指定。
EDIT3 / 4:鉴于输入和所需的参数,使模拟程序更加可信。
答案 0 :(得分:0)
您的模拟程序似乎可以正常工作,并且在大多数情况下的行为都像您希望它的行为一样。也许您的实际程序中有一个错误,但您发布的代码中却没有。
尽管很多测试用例是错误的。
./myprogram requiredparameter <<< echo 'y'
不运行echo y并将其发送到stdin。就像跑步一样
echo ' ' |./myprogram requiredparameter echo 'y'
因此您的程序只读取一个空格。如果要使用外壳程序的<<<
操作符,它将是
./myprogram requiredparameter <<<$(echo 'y')
或者只是
./myprogram requiredparameter <<<y
请注意,<<<之后不能有空格。
我建议您也尝试调试代码,以便可以看到正在发生的事情,或者添加一些调试跟踪,例如:
ans = getchar();
printf("getchar() read character value %d\n", ans); // debug
if (ans == 'y') printf("Your answer was y");
然后,您可以查询getchar返回的ascii值。
还要在printf语句中写一个换行符,所以更改
printf("Your answer was y");
到
printf("Your answer was y\n");
这样,当您在终端中运行程序时,您可以立即看到输出,否则printf的输出将被缓冲,直到您打印换行符或调用fflush(stdout)
或程序正常退出后才会显示