例如,假设我有这样一个程序:
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/