【发布时间】:2022-02-05 08:48:43
【问题描述】:
我正在尝试创建一个程序,用一个或多个指定字符替换源文件中的一个或多个字符,并将新文本写入目标文件。
例如,以下对程序“sub”的调用都会导致将 src.txt 中的 'a' 和 'b' 实例分别替换为 'x' 和 'y' 并将其写入 dest.txt。
$ sub --ab -+xy -i src.txt -o dest.txt
$ sub -i src.txt -o dest.txt --ab -+xy
$ sub -o dest.txt --ab -i src.txt -+xy
$ sub --ab -o dest.txt -+xy -i src.txt
我查看了 C 的 getopt(),但我不认为它涵盖了选项后面可能的多个字符。
程序接受参数的方式是固定的。我将如何解析这些参数,在某些情况下,文本文件中可能有多个字母要替换?并处理任何参数排序?
我无法打开字符串,但我无法使用选项中的特殊字符创建枚举。据我所知 getopt() 不能处理我的程序期望参数的方式。所以我留下了以下非常不完整的代码:
int main(int argc, char * argv[]) {
// help message displayed for "sub" and "sub -h"
if (argc == 1 || strcmp(argv[1], "-h") == 0){
helpMsg();
} else {
// process rest of argv
int i = 2;
while (argc != 0) {
char *opt = argv[i];
switch(opt){
}
i++;
argc--;
}
}
return 0;
}
【问题讨论】:
-
我将如何解析这些论点 - 好吧......手动,如果你想不出办法让它
getopt-friendly。 -
只需使用
argc和argv。但我强烈建议不要使用奇怪的非标准方式来传递参数。不要惹恼用户。 -
--ab和-+xy会让任何长期使用 Linux 的用户感到困惑。或者至少,他们让我感到困惑。这不仅是非标准语法,而且公然违反了-用于短选项而--用于长选项的约定。根据该约定,--ab应该是一个名为“ab”的选项,-+xy应该是-+ -x -y的简写。 -
如您之前所说,您将不得不设置一些变量——用于输入文件、输出文件、搜索字符和替换字符。然后,您遍历传递给程序的每个参数,检查它包含的内容并适当地翻译它。
-+和--符号使这令人讨厌且不标准,但大概这不是你的错,你的老师希望你必须手动完成这项工作。你是对的,(POSIX)getopt()和任何标准变体都不会处理这种表示法——这就是“非标准”在这种情况下的含义。