好吧,我正在尝试使用小型测试应用程序正确地运行参数。我的代码如下。我对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;
}
我这样做了吗?提前谢谢。
答案 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#不同。字符串不是本机类型或对象,而只是美化指向字符数组的指针。
或者,如果您的选项列表变得更复杂,请考虑使用专用选项解析库,例如Boost的Program_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;
}