从主C++解析参数
可能重复: 基本问题在这里。我用g++编译这个程序,并用一个-r参数运行它,./a.out-r,但是它不会输出下面指定的cout语句。这个代码有什么问题吗从主C++解析参数,c++,main,argv,C++,Main,Argv,可能重复: 基本问题在这里。我用g++编译这个程序,并用一个-r参数运行它,./a.out-r,但是它不会输出下面指定的cout语句。这个代码有什么问题吗 #include <string> using namespace std; int main(int argc, char* argv[]) { if (argv[1] == "-r" ) { cout << "First arg is -r" << endl; }
#include <string>
using namespace std;
int main(int argc, char* argv[]) {
if (argv[1] == "-r" ) {
cout << "First arg is -r" << endl;
}
return 0;
}
您不能使用==来比较字符串文本,因为它所做的是比较指针,即内存地址,在本例中,这些指针总是不同的 使用或比较对象:
if (strcmp(argv[1], "-r") == 0) { ... }
或
您不能使用==来比较字符串文本,因为它所做的是比较指针,即内存地址,在本例中,这些指针总是不同的 使用或比较对象:
if (strcmp(argv[1], "-r") == 0) { ... }
或
不能将字符串文字与==进行比较。使用strcmp
另外,不要忘记检查argc是否至少为2。您不能将字符串文本与==进行比较。使用strcmp
此外,别忘了检查argc是否至少为2。通常您会按照以下方式执行操作:
while (--argc && **++argv=='-')
{
char *p;
p=*argv+1;
switch(tolower(*p))
{
case 'r':
break;
}
}
基本上,当剩下一些参数时,检查是否有一个“-”字符,然后打开下一个字符以查看修饰符“r”或“a”等。通常,您会按照以下方式执行操作:
while (--argc && **++argv=='-')
{
char *p;
p=*argv+1;
switch(tolower(*p))
{
case 'r':
break;
}
}
基本上,当剩下一些参数时,检查是否有“-”字符,然后打开下一个字符以查看修饰符“r”或“a”等。代码中的一个错误是比较字符数组的地址,而不是比较数组中的值。正如人们所说的,您可以使用strcmp以C方式完成,尽管使用strncmp更安全,以避免缓冲区溢出
但是,在C++中使用STD::string更容易。 我会将args复制到字符串向量中
#include <vector>
#include <string>
int main(int argc, char* argv[])
{
vector<string> args(argv, argv+argc);
...
代码中的一个错误是比较char数组的地址,而不是比较数组中的值。正如人们所说的,您可以使用strcmp以C方式完成,尽管使用strncmp更安全,以避免缓冲区溢出
但是,在C++中使用STD::string更容易。 我会将args复制到字符串向量中
#include <vector>
#include <string>
int main(int argc, char* argv[])
{
vector<string> args(argv, argv+argc);
...
这是C++,不是C。我仍然可以使用StcMP?@ TISISCRAZY4:那是因为你把问题标记为C++。你仍然可以在C中使用STRCMP,是的,C++,这就是我的意思。是的,两个选项都可以在C++中使用。但是,在XCODE编译时,我会遇到线程异常。这是C++,而不是C。我仍然可以使用StcMP?@ TISISCRAZY4:那是因为你把问题标记为C++。你仍然可以在C中使用STRCMP,是的,C++,这就是我的意思。是的,两个选项都可以在C++中使用。但是,在Xcode中编译时会出现线程异常。