【问题标题】:C using getOpt to parse multiple argumentsC使用getOpt解析多个参数
【发布时间】:2013-01-31 20:30:16
【问题描述】:

我需要使用getopt来解析以下命令:

./center -n name –cp Anumber –i Anumber –t Anumber –s Anumber -fc nameOfaFile

所有这些都可以按任何顺序发出。

所以很明显我必须使用 getOpt。

所以我一直在调查,这就是我目前所拥有的

 void check_parameters (int argc, char** argv) {
    int opt; 

    while((opt = getopt(argc, argv, "n:cp:i:c:fc:")) != -1) {
       printf("give me opt %c \n", opt)
       swicth(opt){
          case 'n' :
             //do something
          case 'cp' :
             //do something
          case 'i' :
            //do something
       }
    }
  }

我知道一个事实,即 3 参数:OptString 是我告诉 getOpt 它应该期望的选项的字符是什么 optarg 中也是参数所在的位置

它不工作! 当我 printf("give me opt %c", opt) 它给我的是数字,而不是字符!

因此它不起作用。它没有正确检查参数

编辑: 做完 man 3 getopt getopt 的返回值为:如果成功找到一个选项,则 getopt() 返回选项字符。如果已解析所有命令行选项,则 getopt() 返回 -1。
它返回选项字符?它总是返回整数 1。总是!我不明白 getopt 是如何工作的。开关与字符相比如何?!

【问题讨论】:

  • getopt 处理单个字符选项,它不能处理例如fc 作为一个选项。同样 case 'cp' 是错误的,您不能将 2 个字符指定为单个字符。请展示您拥有的真实代码,包括打印选项的位置 - 当前代码几乎没有意义,并向我们展示您的程序的实际输出。
  • 执行“man getopt”;它确实返回一个int。我不明白你的问题。
  • 您介意发布实际的可编译代码吗?这段代码充满了无意义和语法错误。
  • @hari 如果成功找到选项,则 getopt() 返回选项字符。如果所有命令行选项都已解析,则 getopt() 返回 -1。

标签: c parsing getopt


【解决方案1】:

首先,这个:

case 'cp':

...没有意义。不能用charint 表示两个字符。此外,如果使用-cp 101 运行程序,getopt 会将其视为-c p 101,以获得完全不同的结果。如果您想使用长选项,请改用getopt_long 和适当的调用语法,例如:./a.out -n 42 --cp 101

现在,这是getopt() 的工作示例:

#include <stdio.h>
#include <getopt.h>

int main(int argc, char* argv[]) {
  int opt;

  while((opt = getopt(argc, argv, "n:cp:i:c:fc:")) != -1) {
    switch (opt){
      case 'n':
        printf("n was %s\n", optarg);
        break;

      case 'i':
        printf("i was %s\n", optarg);
        break;
    }
  }
  return 0;
}

【讨论】:

  • @Alessandroempire:您是否将开关传递给您的可执行文件?
  • 不,我没有……这很奇怪。一些简单的事情是行不通的。
  • 实际上写在那里的内容毫无意义:opt 是一个整数,而 'n 是一个字符。你到底要如何比较整数和字符?
  • @Alessandroempire:charint 都有整数类型,但它们的大小可能不同。这很有意义。
【解决方案2】:

getopt 只处理单字符选项名称,而不是 -cp-fc 之类的东西(它解释为单个字符串中的多个选项标志:-c -p-f -c)。如果你想坚持你定义的语法,那么自己动手会更容易:

// first check whether argc is odd, then:
for (i = 1; i < argc; i += 2) {
    if (strcmp(argv[i], "n") == 0) {
        name = argv[i+1];
    } else if (strcmp(argv[i], "cp") == 0) {
        // etc. etc.
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多