当用户提供空命令行值时,如何投掷错误

How do I throw error when user gives empty command line values?

本文关键字:何投掷 错误 命令行 用户      更新时间:2023-10-16

我正在使用命令行选项进行操作类型,因此,对于登录,用户必须执行诸如 NameOfExe --username Admin --password Admin

之类的命令

我的问题是,我如何确保用户在此类 NameOfExe --username --password

编辑: -

现在,我以这样的参数值

char* Cli::getCmdOption(char** begin,
                    char** end,
                    const std::string& option)
{
  char** itr = std::find(begin, end, option);
  if (itr != end && ++itr != end)
  {
        return *itr;
  }
    return (char*)"";
}

并将其用作getCmdOption(argv , argv+argc , "--userName")

这是进行参数解析的一种非常不寻常的方法,当参数的参数也是有效的选项本身时,它可能会引起问题(例如,在您的--loginname "--password"示例中。

一种更惯用的C 方法(直接在您的代码中,或埋在选项库中)迭代argv[],依次考虑每个单词:

#include <iostream>
#include <string>
#include <vector>
int main(int argc, char **argv)
{
    std::string username;
    std::string password;
    std::vector<std::string> values;
    for (auto i = 1;  i < argc;  ++i) {
        std::string arg = argv[i];
        if (arg == "--username") {
            ++i;
            if (i >= argc) {
                std::cerr << argv[0] << ": --username requires a value" << std::endl;
                return 1;
            }
            username = argv[i];
        } else if (arg == "--password") {
            ++i;
            if (i >= argc) {
                std::cerr << argv[0] << ": --password requires a value" << std::endl;
                return 1;
            }
            password = argv[i];
        } else {
            values.emplace_back(argv[i]);
        }
    }

    std::cout << "Username = " << username << 'n';
    std::cout << "Password = " << password << 'n';
    for (auto i = 0u;  i < values.size();  ++i)
        std::cout << "Argument " << i << " = " << values[i] << 'n';
}

显然上面有很多重复,但原则适用:依次测试每个参数,如果是需要值的选项,请提高参数索引并读取该值。

经过少量选项后,您最终将创建一个从选项名称到如何处理该选项的表示形式,并使用或重新发行一个选项处理库。