2009-01-14 32 views
3

好的,我试图让参数在小测试应用程序中正常工作。我的代码如下。我在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; 
} 

我是对的吗?提前致谢。

回答

12

您正在比较字符串“-print”的内存地址与内存地址argument。这不行!使用strcmp()来比较字符串值。相反的:

if (argument == "-print") 

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

你不能比较喜欢这个字符串!

使用strcmp()比较字符串。

8

下面一行是错误的:

if (argument == "-print") 

在这里,我们比较指针,不是字符串值。替换为:

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

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

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

2

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

std::string argument; 

,然后用==比较会的工作?

1

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

此外,你在循环外部分配参数,你会想在循环内部做到这一点,否则你只会在循环中每次测试参数#1。

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