命令行参数不起作用 - 完全跳过它们

时间:2009-01-14 09:11:43

标签: c++ command-line arguments

好吧,我正在尝试使用小型测试应用程序正确地运行参数。我的代码如下。我对C ++没有太多的经验,所以我不确定为什么当我使用-print(或--print)启动测试时,它会自动声明“Not a valid option”然后结束。

#include <iostream>

int main(int argc, char* argv[])
{
    int option;
    option = 1;
    char* argument;
    argument = argv[option];
    while (option < argc)
    {
        if (argument == "-print")
        {
            std::cout << "Printing Extra Text";
        }
        else
        {
            std::cout << "Not a valid option" << std::endl;
        }
        option++;
    }
    std::cout << "Printing normal text" << std::endl;
    return 0;
}

我这样做了吗?提前谢谢。

6 个答案:

答案 0 :(得分:12)

您将字符串“-print”的内存地址与argument的内存地址进行比较。这不行!使用strcmp()比较字符串值。而不是:

if (argument == "-print")

DO

if (strcmp(argument, "-print") == 0)

答案 1 :(得分:8)

以下行有错:

if (argument == "-print")

这里你要比较指针,而不是字符串值。替换为:

if (strcmp(argument, "-print") == 0)

对于字符串处理,C / C ++的行为与Java或C#不同。字符串不是本机类型或对象,而只是美化指向字符数组的指针。

或者,如果您的选项列表变得更复杂,请考虑使用专用选项解析库,例如BoostProgram_options。它将处理所有方面,包括验证和用户消息。

答案 2 :(得分:2)

我用C ++编程已经有一段时间了,但不应该只使用

std::string argument;

然后与==的比较会起作用吗?

答案 3 :(得分:1)

if (argument == "-print")

你无法比较像这样的字符串!

使用strcmp()比较字符串。

答案 4 :(得分:1)

您的问题表明您还要测试--print(两个短划线),但您的代码不会检查它。

此外,你在循环外部分配参数,你将希望在循环内部执行此操作,否则每次循环时你只会测试参数#1。

答案 5 :(得分:1)

当你阅读论证时,还有另一个问题。 (进行所有必要的更改)

int main(int argc, char* argv[])
{
    int option;
    option = 1;
    char* argument;
    while (option < argc)
    {
        argument = argv[option];
        if (strcmp(argument, "-print") == 0)
        {
            std::cout << "Printing Extra Text";
        }
        else
        {
            std::cout << "Not a valid option" << std::endl;
        }
        option++;
    }
    std::cout << "Printing normal text" << std::endl;
    return 0;
}