gpt4 book ai didi

c++ - 在 C++ 中解析命令行参数?

转载 作者:IT老高 更新时间:2023-10-28 12:11:32 27 4
gpt4 key购买 nike

如果程序被指定为这样运行,那么在 C++ 中解析命令行参数的最佳方法是什么:

prog [-abc] [input [output]]

标准库中是否有一些方法可以做到这一点,还是我需要编写自己的代码?


相关:

最佳答案

boost::program_options 和 GNU getopt 的建议都不错。

但是,对于简单的命令行选项,我倾向于使用 std::find

例如,在 -f 命令行参数之后读取文件名。您也可以只检测是否传递了单个单词选项,例如 -h 以寻求帮助。

#include <algorithm>

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

bool cmdOptionExists(char** begin, char** end, const std::string& option)
{
return std::find(begin, end, option) != end;
}

int main(int argc, char * argv[])
{
if(cmdOptionExists(argv, argv+argc, "-h"))
{
// Do stuff
}

char * filename = getCmdOption(argv, argv + argc, "-f");

if (filename)
{
// Do interesting things
// ...
}

return 0;
}

使用这种方法需要注意的一点是,您必须使用 std::strings 作为 std::find 的值,否则将对指针值执行相等检查。


我希望可以编辑此回复而不是添加一个新回复,因为这是基于原始答案的。我稍微重写了函数并将它们封装在一个类中,所以这里是代码。我认为以这种方式使用它可能也很实用:

class InputParser{
public:
InputParser (int &argc, char **argv){
for (int i=1; i < argc; ++i)
this->tokens.push_back(std::string(argv[i]));
}
/// @author iain
const std::string& getCmdOption(const std::string &option) const{
std::vector<std::string>::const_iterator itr;
itr = std::find(this->tokens.begin(), this->tokens.end(), option);
if (itr != this->tokens.end() && ++itr != this->tokens.end()){
return *itr;
}
static const std::string empty_string("");
return empty_string;
}
/// @author iain
bool cmdOptionExists(const std::string &option) const{
return std::find(this->tokens.begin(), this->tokens.end(), option)
!= this->tokens.end();
}
private:
std::vector <std::string> tokens;
};

int main(int argc, char **argv){
InputParser input(argc, argv);
if(input.cmdOptionExists("-h")){
// Do stuff
}
const std::string &filename = input.getCmdOption("-f");
if (!filename.empty()){
// Do interesting things ...
}
return 0;
}

关于c++ - 在 C++ 中解析命令行参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/253556/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com