【问题标题】:Flag order in CC中的标志顺序
【发布时间】:2017-03-07 15:39:31
【问题描述】:

所以我对 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;

【问题讨论】:

  • 您在问题中遗漏了您的代码,因此我们可以看到您做错了什么? :)
  • 当您说“它无法识别...”时,您所指的“它”是什么?
  • 问题不在于程序参数是否出现在argv 数组中——它们都出现了,按照它们在命令行中出现的顺序——而是你的程序对它们做了什么。当您没有提供任何程序时,我们无法谈论您的程序所做的事情。如果您需要代码方面的帮助,我们通常会收到 minimal reproducible example 来证明您的问题。

标签: c arguments argv getopt


【解决方案1】:

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) 进行选项处理,除非您有充分的理由否则的话。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      相关资源
      最近更新 更多