我正在尝试解析C程序中的两个选项。
该程序的调用如下:
./a.out [OPTIONS] [DIRECTORY 1] [DIRECTORY 2]
程序同步两个目录并有两个选项。 (-r)
用于递归同步(文件夹内的文件夹),(-n)
用于将文件从本地复制到远程,以防远程不存在。
Options are:
-r : recursive
-n : copy file if it doesn't exist in remote folder
所以打电话:
./a.out -r D1 D2
将递归地同步从D1
到D2
的所有文件和目录。 <{1}}中显示的文件以及D1
中不存在的文件将被忽略。
并致电:
D2
会做同样的事情,但./a.cout -rn D1 D2
中存在且D1
中不存在的文件会被复制到D2
。
问题在于,调用D2
与调用./a.out -rn
不同,./a.out -nr
无效,因为./a.out -r -n
不是(-n)
。
以下是我实现主要内容的方法。
D1
答案 0 :(得分:3)
这里有两个(潜在的)问题:
您的短选项字符串中有一个迷路:
。这使得-n
可以选择吞下任何后续r
。您还可以设置长选项以获取强制参数。
您已经以不灵活的方式对参数编号进行了硬编码,并且您没有测试它们是否存在。
试试这个:
int main(int argc, char** argv) {
int next_option = 0;
const char* const short_options = "hrn";
extern int optind;
const struct option long_options[] = {
{ "help", no_argument, NULL, 'h' },
{ "recursive", no_argument, NULL, 'r' },
{ "new", no_argument, NULL, 'n' },
{ NULL, no_argument, NULL, 0 }
};
int recursive = 0;
int new = 0;
do {
next_option = getopt_long(argc, argv, short_options, long_options, NULL);
switch(next_option) {
case 'r':
recursive = 1;
break;
case 'n':
new = 1;
break;
case 'h':
print_help();
return 0;
case -1:
break;
default:
print_help();
return -1;
}
} while(next_option != -1);
if (optind + 1 >= argc)
return -1;
sync(argv[optind], argv[optind+1], recursive, new);
return EXIT_SUCCESS;
}
答案 1 :(得分:1)
使用命令行(例如-r -n
)的问题是因为您在sync
的调用中对索引进行了硬编码。你不应该这样做。
如果您阅读了getopt_long
手册页(当您遇到某个功能问题时总会这样做!)那么您会注意到这一行:
如果没有其他选项字符, getopt()将返回-1。然后 optind 是第一个 argv 元素的 argv 中的索引,它不是一个选项。
仔细阅读第二句话。