C中的标记顺序

Flag order in C

所以我对 argv 数组中的 C 中的标志和参数有疑问。 当我通过终端输入命令时: 示例:./main a b c -a 它不识别末尾的 -a 但如果我将它放在所有参数的开头,例如:./main -a a b c 它会检测到它。

我试着用 if 交换它,这样它就会在所有参数的前面,但交换后它不会继续。就像忽略它之后的 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;

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)选项处理,除非您有充分的理由不这样做。

好的,我已经通过更改 if 语句修复了它

if(strcmp(argv[optind-1], "-a") == 0){
            swap(&argv[optind-1], &argv[1]);
        }