3

好吧,我正在尝试让参数与小型测试应用程序一起正常工作。我的代码如下。我在 C++ 方面没有太多经验,所以我不确定为什么当我使用 -print(或 --print)启动测试时,它会自动声明“不是有效选项”,然后结束。

#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;
}

我这样做对吗?提前致谢。

4

6 回答 6

12

您正在将字符串“-print”的内存地址与argument. 这行不通!用于strcmp()比较字符串值。代替:

if (argument == "-print")

if (strcmp(argument, "-print") == 0)
于 2009-01-14T09:14:54.410 回答
8

以下行有问题:

if (argument == "-print")

在这里,您正在比较指针,而不是字符串值。用。。。来代替:

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

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

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

于 2009-01-14T09:17:35.030 回答
2

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

std::string argument;

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

于 2009-01-14T09:25:10.943 回答
1
if (argument == "-print")

你不能像这样比较字符串!

使用 strcmp() 比较字符串。

于 2009-01-14T09:15:00.497 回答
1

您的问题表明您还想测试 --print (两个破折号),但您的代码不会检查它。

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

于 2009-01-14T09:33:25.153 回答
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;
}
于 2009-01-14T09:47:54.983 回答