-2

我需要使用 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 是如何工作的。开关与字符相比如何?!

4

2 回答 2

4

首先,这个:

case 'cp':

...没有意义。不能用charor表示两个字符int。此外,如果使用 运行程序-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;
}
于 2013-01-31T20:48:48.403 回答
2

getopt仅处理单字符选项名称,而不是诸如-cpor之类的东西-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.
    }
}
于 2013-01-31T20:45:27.910 回答