c - C 中的标志顺序

标签 c arguments argv getopt

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

我尝试将其与 if so 交换,它将位于所有参数的前面,但交换后它不会继续。比如忽略后面的 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 ) 进行选项处理,除非你有充分的理由不这样做。

关于c - C 中的标志顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42652372/

相关文章:

c - 简单信号 - C 编程和报警功能

c - 如何强制 scanf 匹配空格?

C 函数参数 : struct, 或 const struct*

c# - 传递数组作为参数

c - 使用 argv 打开文件给我文件 NULL

Python - 如果 sys.argv 包含 "&"字符,则不会打开第二个子进程

c++ - 为什么我的命令行参数处理会导致我的程序崩溃?

c - 释放内存整数数组时出现段错误

c - 在哪里可以找到 stdio.h 的实现?

java - 我们什么时候应该使用命令行参数?