使用getopt访问命令行用户参数

时间:2016-11-09 13:38:06

标签: c++ getopt

我正在编写一个程序来处理用户的选项和使用getopt编程的函数。我的问题是,如果用户输入无效选项,如何显示错误?此外,我想访问该变量,以便在错误消息中显示它。这是我的代码的快照:

#include <unistd.h>
#include <iostream>

int main(int argc, char **argv)
{
    enum {
        WHOLE, PREFIX, ANYWHERE, SUFFIX, EMBEDDED
    } mode;
    bool reverse_match = false;
    bool ignore_case = false;
    bool specify_length = false;

    int c;
    while ((c = getopt(argc, argv, "wpsavein:")) != -1) {
        switch (c) {
        case '?':
            std::cerr << "Unrecognised option " << std::endl;
            std::cerr << "Usage: match [-OPTION]... PATTERN [FILENAME]..." << std::endl;
            return 2;
            break;
        case 'w': // pattern matches whole word
            mode = WHOLE;
            break;
        case 'p': // pattern matches prefix
            mode = PREFIX;
            //cout << "test: " << optarg << endl;
            break;
        case 'a': // pattern matches anywhere
            mode = ANYWHERE;
            break;
        case 's': // pattern matches suffix
            mode = SUFFIX;
            break;
        case 'v': // reverse sense of match
            reverse_match = true;
            break;
        case 'e': // pattern matches anywhere
            mode = EMBEDDED;
            break;
        case 'i': // ignore case
            ignore_case = true;
            break;
        case 'n': // specifies length of match
            specify_length = true;
        }
    }
}

我使用cerr流来显示错误,但我希望它还包含用户输入。例如,如果用户输入-t,则错误为:

Unrecognised option -t
Usage: match [-OPTION]... PATTERN [FILENAME]...

我得到的是:

invalid option -- 't'
Unrecognised option -t
Usage: match [-OPTION]... PATTERN [FILENAME]...

我相信invalid option -- 't'是默认设置,但有哪些方法可以修改或不包含它?并且还可以访问用户指定的选项?

1 个答案:

答案 0 :(得分:0)

来自getopt的手册片段:

  

如果getopt()无法识别选项字符,则会输出          向stderr发送错误消息,将该字符存储在optopt中,然后返回          &#39;&#39 ;.调用程序可以通过设置来防止错误消息          opterr为0。

您需要做什么:

#include <unistd.h>
#include <iostream>

int main(int argc, char **argv) {
  opterr = 0;
  int c;
  while ((c = getopt(argc, argv, "wpsavein:")) != -1) {
    switch (c) {
      case '?':
        std::cerr << "Unrecognised option -" << static_cast<char>(optopt)
                  << std::endl;
        std::cerr << "Usage: match [-OPTION]... PATTERN [FILENAME]..."
                  << std::endl;
        return 2;
        break;
    }
  }
}