当用户提供空命令行值时,如何投掷错误
How do I throw error when user gives empty command line values?
我正在使用命令行选项进行操作类型,因此,对于登录,用户必须执行诸如 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';
}
显然上面有很多重复,但原则适用:依次测试每个参数,如果是需要值的选项,请提高参数索引并读取该值。
经过少量选项后,您最终将创建一个从选项名称到如何处理该选项的表示形式,并使用或重新发行一个选项处理库。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Poco Websocket投掷错误的URL例外.为什么
- Cython投掷语法错误
- 将向量对象存储在共享指针投掷错误中
- 当用户提供空命令行值时,如何投掷错误
- CTF阅读器为CNTK中的大文件投掷错误
- CIN投掷错误消息
- 功能指针数组(包括成员功能)投掷模板专业化错误
- ./configure用ssldump代码库投掷错误
- C++德克投掷赛格错误
- 持续投掷错误:将chill指数赢得为0