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

标签 c++ command-line-arguments

如果程序被指定为这样运行,那么在 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/39504708/

相关文章:

C++编译问题;类方法

c++ - 每隔一段时间执行一次操作

c++ - 控制台应用程序和图形界面之间的交互类型

c++ - 基于数组大小有效性的特化

java - 使用文件作为命令行参数 Java

c - 如何有效地从文件中读取环境参数,与 exec 一起使用

c++ - clang 3.3 中的模板默认 Arg 替换失败

command-line-arguments - Inno Setup IDE和ISCC/ISPP传递定义

java - args4j:如果给出/未给出另一个参数,如何使参数成为必需的?

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