【发布时间】:2018-02-26 14:20:05
【问题描述】:
删除C.c
#include <stdio.h>
int main(int argc, char **argv) {
if (argc != 2) {
int c;
while((c = getchar()) != EOF) {
if(c != 'c') {
putchar(c);
}
}
} else {
for (size_t i = 0; argv[1][i] != '\0'; i++) {
if(argv[1][i] != 'c') {
putchar(argv[1][i]);
}
}
putchar('\n');
}
}
removeC.c 删除文件中的每个 c 然后将其打印到标准输出。例如,
$ gcc -Wall removeC.c
$ ./a.out abc
ab
$ echo abc | ./a.out
ab
$ ./a.out file1
ab
假设file1的内容也是'abc'
目标是让它像标准的 Unix 工具一样工作(但它允许不使用任何命令行选项,即“./a.out -w somefile”)。
如何处理“-”的命令行参数?
【问题讨论】:
-
我没有测试,但如果您不提供参数,您的代码似乎会读取标准输入。因此,试试这个:
cat file1 | ./a.out -
查看
getopt的手册页。 -
getopt是你的答案,它有很好的文档记录,但你可以在这里寻找一个起点:stackoverflow.com/questions/17877368/… -
您的
argc != 2条件不包含任何参数,但也包含许多参数。您应该仔细区分这些情况;您应该(几乎可以肯定)以完全不同的方式处理./a.out和./a.out *。 -
讽刺的答案是
−(U+2212 减号)被视为任何其他文件名。 (问题中引用的字符是 U+2212,而不是 U+002D 或 ASCII-。)大多数 POSIXy/UNIXy 应用程序只特别对待--:所有以下参数都被视为文件名,即使它们以破折号-(U+002D 连字符-减号)。正如其他人所提到的,一些应用程序将-视为标准输入的名称;即使您碰巧有一个名为-的文件,这也不是问题,因为您始终可以使用相对路径来引用它,例如./-。)