c - 如何通过管道传递接受参数的 c 程序?

标签 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

最佳答案

Is it possible to tweak this code to make piping work? As in,

当然。

您需要从 stdin 中读取数据,并按照您认为合适的方式进行处理,而不是读取 argv 的内容。

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

关于c - 如何通过管道传递接受参数的 c 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48971130/

相关文章:

c - 使用大整数数组

c - 调用 printf 时的堆栈 View ?

c - 在c中读取8位灰度bmp文件的问题

c - Linux Kernel Makefile.build 构建外部模块时的奇怪行为

c - 修改后被其他人覆盖原始文件

c - printf 有时会打印额外的垃圾

c - 函数和宏之间的区别

c++ - 如何在 C/C++ 中使用 SSHA1?

c - C 中条件 if 条件的简写形式

objective-c - 在 Xcode 中分配基本数学运算结果时出现 "initializer element is not a compile-time constant"