例如,假设我有这样的程序:
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
答案 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