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

Access to command line user arguments using getopt

本文关键字:用户 参数 命令行 访问 getopt 使用      更新时间:2023-10-16

我正在编写一个程序,处理来自用户的选项和使用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'是默认的,但是有一种方法我可以修改或不包括它?还可以访问用户指定的选项?

来自getopt:

的手册片段

如果getopt()不识别选项字符,它打印一个错误消息到stderr,将字符存储在optopt中,并返回' ? '。调用程序可以通过设置来阻止错误消息

你需要做的:

#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;
    }
  }
}