2010-01-04 161 views
2

我写了下面的代码,它不起作用,但是当我改变它时,第二个代码段将会起作用。C++比较c字符串的问题

int main(int argc, char *argv[]) 
{ 
    if(argv[ 1 ] == "-i") //This is what does not work 
    //Do Something 
} 

但是,如果我写这样的代码,这将工作。

int main(int argc, char *argv[]) 
{ 
    string opti = "-i"; 

    if(argv[ 1 ] == opti) //This is what does work 
    //Do Something 
} 

是因为字符串类==作为一个重载成员,因此可以执行此操作吗?

在此先感谢。

+0

有使用STRCMP任何问题吗?我只是想知道这样做的好处... – rplusg 2010-01-04 06:29:35

+1

它看起来像你试图阅读命令行选项。如果您在Linux机器上,请查看getopt()函数http://linux.die.net/man/3/getopt – 2010-01-04 07:40:32

回答

11

是因为字符串类==作为一个超载成员,因此可以执行此操作?

你是对的。 char *类型的正则值没有重载操作符。为了比较C字符串,

if (strcmp(argv[1], "-i") == 0) { 
    ... 
} 

通过比较字符串你做(与==直接)的方式,你是比较值指针。由于"-i"是编译时间常量,而argv[1]是别的,它们永远不会相等。

+0

谢谢。 – user174084 2010-01-04 06:19:09

9

正确。当你做argv[1] == "-i"(在两个char*表达式上使用==),你比较指针是否相等,而不是字符串中的字符。您必须使用strcmp函数来比较字符串数据。

std::string已重载运算符来检查字符串==字符串,字符* ==字符串和字符串==字符*,但它不可能重载字符* ==字符*因为它已经有一个定义的含义:比较指针。

1

这一个在C中可以正常工作。请记住检查argc,以免发生seg故障。还有strncmp(),这是比较字符串的一种安全方法,因为它会限制字符串的最大长度。

#include <string.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    if((argc > 1) && (strcmp(argv[1], "-i") == 0)) 
    { 
     printf("got -i\n"); 
    } 
} 

如果您传递多个PARAMS作为命令选项检查getopt()