【问题标题】:How to check if main parameter exist and validate it in C++ [duplicate]如何检查主要参数是否存在并在C++中验证它[重复]
【发布时间】:2016-08-26 11:47:00
【问题描述】:

如果我想验证用户是否在程序中输入了特定参数,我该怎么做?这是我当前的代码:

#include <iostream>
#include <cstdlib>

int main (int argc, char* argv[]) {

    if (argv[1] == "--para") {
        std::cout << "Some text here..." << std::endl;
    }

}

上面的代码不起作用,因为我需要某种方法将参数转换为字符串,以便我可以在 if 语句中验证它。

我不知道在程序中使用多个参数时如何检查--para是否存在。

示例:

./main parameter1 parameter2 --para

【问题讨论】:

  • 说真的,它真的有助于在潜入并尝试做某事之前了解 C。否则你将进入一个痛苦的世界。
  • @dandan78:嗯,如果您能详细说明,它真的会有所帮助。也许它可以引导我朝着正确的方向前进?
  • 嗯,我经常看到这类问题令人沮丧。它告诉我的是,有些人想用 C 或 C++ 编程,但甚至懒得事先阅读一两个关于该主题的教程。在 Stackoverflow 上,假设您在提出问题之前先完成了作业,而您显然没有。既然如此,你就靠自己了。

标签: c++


【解决方案1】:

您可以直接构造和使用std::stringsstd::vector

#include <iostream>
#include <string>
#include <vector>

int main(int argc,char* argv[])
{
    std::vector<std::string> params{argv, argv+argc};

    for (auto i : params)
        if (i == "--para") {
            std::cout << "Some text here..." << std::endl;
        }

    return 0;
}

如果您想知道是否至少有一个参数匹配,您可以使用标准库算法进行检查:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

int main(int argc,char* argv[])
{
    std::vector<std::string> params{argv, argv+argc};
    const std::string para{"--para"};

    if (std::any_of(params.begin(),params.end(),[&para](std::string val) {return val==para; }))
            std::cout << "Some text here..." << std::endl;

    return 0;
}

【讨论】:

  • 不会处理多个参数(argc > 2)
  • @FrankPuffer 为什么不呢?
  • 文本“--para”不一定是第一个参数,请参阅问题末尾的示例。
【解决方案2】:

你需要循环检查:

for( int i = 1; i < argc; i++ ) {
    if (strcmp(argv[i], "--para") == 0) {
        std::cout << "Some text here..." << std::endl;
    }
}

您可以将字符指针转换为字符串,而不是使用strcmp

for( int i = 1; i < argc; i++ ) {
    std::string str(argv[i]); 
    if (str ==  "--para") {
        std::cout << "Some text here..." << std::endl;
    }
}

【讨论】:

  • const char* 平等检查时不要使用==!使用strcmp 或构造一个std::string
【解决方案3】:

您可以使用 strcmp 在纯 c 中完成此操作。例如检查第一个参数:

if(argc > 1 && strcmp(argv[1], "--para") == 0) {
// do some stuff here
}

您可以循环其他参数并应用相同的逻辑来检查其他参数

【讨论】:

  • 不会处理多个参数(argc > 2)。
  • 已编辑。没注意到问题的那一部分
【解决方案4】:

这是一个已解决的问题。那里有很多图书馆。我喜欢 argp,但它是 gnu 特定的(我认为)。它也是 C,不是 C++,但可以工作。 Boost 对此也有一个实用程序。我敢肯定还有几十个。不要重新发明轮子。

http://optionparser.sourceforge.net/

http://tclap.sourceforge.net/

boost

What parameter parser libraries are there for C++?

【讨论】:

  • 基本正确,但取决于 OP 想要做什么,这些库可能有点矫枉过正。使用库也有缺点。
  • @FrankPuffer:完全同意。 Flatmouse 的答案是我赞成的答案,我认为这是最好的答案(根据您的评论进行修改后)。我想为这个问题提供另一套解决方案,并尝试为未来的搜索者提供进一步的见解,而不仅仅是 OP。
猜你喜欢
  • 2019-01-03
  • 2016-03-11
  • 2017-09-20
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多