所以我对argv数组中的C中的标志和参数有疑问。
当我通过终端输入commant时:
示例:./main a b c -a
它不会在最后识别-a但是如果我把它放在所有参数的开头,例如:./main -a a b c
它会检测到它。
我尝试交换它,如果是这样,它将在所有的争论之前,但在交换后它不会继续。有点像忽略它之后的for循环。所以它只是交换它然后结束案件。如果有人知道我在这里失踪了什么,我会很高兴。
代码:
while ( (c = getopt(argc, argv, ":ahd:")) != -1) {
switch (c) {
case 'a':
if(strcmp(argv[argc-1], "-a") == 0){
swap(&argv[argc-1], &argv[1]);
}
for(i = optind; i < argc; i++){
for(j = optind; j < argc - 1; j++){
if(strcmp(argv[j], argv[j + 1]) > 0){
swap(&argv[j], &argv[j + 1]);
}
}
}
for(z = optind; z < argc; z++){
printf("%s\n", argv[z]);
}
printf("%s\n", argv[1]);
break;
答案 0 :(得分:0)
getopt()
的GNU版本允许对参数进行排列,以便处理所有-a
样式选项(出现在--
选项之前),即使存在非选项他们面前的争论。
some_program -z abc def -b -- -w warning
-z
和-b
选项将被GNU getopt()
识别,但-w
将是非选项参数。
getopt()
的POSIX版本不允许这样做; getopt()
的许多非GNU实现都不这样做。 GNU知道他们所做的是一个扩展;可以通过在环境中设置POSIXLY_CORRECT
来转换置换行为。
如果您希望在任何地方识别选项,请在程序中使用GNU getopt()
。如果要使用本地getopt()
保持可移植性,或者无法在程序中使用GPL代码,请将系统设计为在非选项参数之前放置选项。请注意,像make
和C编译器这样的程序已经有自定义参数处理系统,允许交叉选项和非选项参数 - 但是你应该遵循POSIX编码指南(Utility Conventions)进行选项处理,除非你有充分理由不这样做。
答案 1 :(得分:0)
好的我已经修改了句子
if(strcmp(argv[optind-1], "-a") == 0){
swap(&argv[optind-1], &argv[1]);
}