输入getchar()的管道会提示c

时间:2018-09-20 07:50:52

标签: c ubuntu

假设我有一个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:鉴于输入和所需的参数,使模拟程序更加可信。

1 个答案:

答案 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)或程序正常退出后才会显示