如何管道一个接受参数的c程序?

时间:2018-02-25 07:08:55

标签: c

例如,假设我有这样的程序:

file1.c是

#include <stdio.h>

int main(int argc, char **argv) {
    if (argc != 2) {
         printf("one file only\n");
         return (1);
     } else {
         for (size_t i = 0; argv[1][i] != '\0'; i++) {
             if(argv[1][i] != 'a') {
                 putchar(argv[1][i]);
             }
         }
         putchar('\n');
     }
 }

上面是一个简单的问题,它迭代argv [1]的输入并删除每个'a'。

例如

$ gcc -Wall file1.c
$ ./a.out abcd
bcd

是否可以调整此代码以使管道工作?如,

$ echo abcd | ./a.out
bcd

1 个答案:

答案 0 :(得分:2)

  

是否可以调整此代码以使管道工作?如,

当然。

您需要阅读argv中的数据并根据需要进行处理,而不是阅读stdin的内容。

int main() {
   int c;
   while ( (c = getchar()) != EOF )
   {
      if(c != 'a') {
         putchar(c);
      }
   }
}

如果您想要两种选择,可以使用:

int main() {
   int c;
   if ( argc == 2 )
   {
      for (size_t i = 0; argv[1][i] != '\0'; i++) {
         if(argv[1][i] != 'a') {
            putchar(argv[1][i]);
         }
      }
   }
   else
   {
      int c;
      while ( (c = getchar()) != EOF )
      {
         if(c != 'a') {
            putchar(c);
         }
      }
   }

}

如果您希望代码保持不变,则必须使用另一个帮助程序将echo abcd的输出转换为a.out的参数。在Linux上,xargs就是这样一个程序。

echo abcd | xargs a.out