2011-05-15 215 views
2

我想做一个小文本冒险来获得C++的句柄。比较std :: string与常量vs比较字符数组与常量在C++

cin >> keyboard1; 
if ((keyboard1 == "inv")inventory(inv); 

这将工作,如果keyboard1是一个字符串,但不会,如果它是一个字符数组,这是因为我还没有包括在恒定的末尾空?

+0

感谢您的编辑。我缩进了四个空格,之前已经工作了...... – Hagbard 2011-05-15 12:50:38

回答

2

Let'say你的代码如下:

int main(int argc, char *argv[]) 
{ 
    std::string s; 
    std::cin >> s; 
    std::cout << s << std::endl; 
    if (s == "inv") { 
     std::cout << "Got it" << std::endl; 
    } 
    return 0; 
} 

可正常工作的,因为STL类string覆盖==操作的方式。

你不能指望下面的代码,而不是工作:

int main(int argc, char *argv[]) 
{ 
    char *s = (char *)calloc(10, sizeof(char)); 
    std::cin >> s; 
    std::cout << s << std::endl; 
    if (s == "inv") { 
     std::cout << "Got it" << std::endl; 
    } 
    return 0; 
} 

因为你所在的字符串开始一个常量字符串(其中,顺便说一句,自动空值比较s,这是地址由编译器终止)。

您应该使用的strcmp比较 “C字符串”:

int main(int argc, char *argv[]) 
{ 
    char *s = (char *)calloc(10, sizeof(char)); 
    std::cin >> s; 
    std::cout << s << std::endl; 
    if (strcmp(s, "inv") == 0) { 
     std::cout << "Got it" << std::endl; 
    } 
    return 0; 
} 

这工作。

2

不,它不起作用的原因是因为你会比较表示每个字符串的内存地址。改为使用strcmp/wcscmp

比较字符串和常量的原因是因为字符串类将定义一个相等运算符(例如bool StringClass:operator==(const char* pszString))。

+0

哦,我明白了。所以我可以比较一个字符数组,如果我彻底改造了车轮。谢谢帮助很多 – Hagbard 2011-05-15 12:59:04

+0

@Hagbard:不,你不能,因为那会涉及重载一个运算符只是原始类型,这是不允许的。 – Puppy 2011-05-15 13:54:24

+0

@DeadMG我的意思是建议我可以创建一个基于char数组的类,并在该类上重载==运算符,但是由于该类和其他一些很好的功能已经包装在字符串类中,它将重新创建劣质轮子。 – Hagbard 2011-05-30 23:55:26

0

如果keyboard1是一个char数组,则if (keyboard1 == "inv")正在执行一个简单的指针比较(都变成char*)。

keyboard1是一个字符串,它可以调用一个operator==(cosnt string&, const char*)如果存在,否则,如果字符串具有非显式构造string(const char *s),常数"inv"将被隐式转换为字符串对象,并应用于operator==(const string&,const string&)