在C++中,将std::string与常量进行比较与将字符数组与常量进行比较的比较

3

我正在尝试制作一个小型的文字冒险游戏,以掌握C ++。

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

如果keyboard1是一个字符串,那么这将起作用;但如果它是一个字符数组,则不会,这是因为我没有在常量末尾包含null吗?

感谢您的编辑。我缩进了四个空格,这在以前是有效的... - Hagbard
3个回答

3

假设你的代码如下:

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与常量字符串进行比较(顺便说一下,这个字符串由编译器自动以null结尾)。

你应该使用strcmp来比较“c-strings”:

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))。

哦,我明白了。所以如果我完全重新发明一个轮子,我就可以比较字符数组。谢谢,这帮了我很多。 - Hagbard
@Hagbard:不行,因为那会涉及到为基本类型重载运算符,而这是不允许的。 - Puppy
@DeadMG 我的意思是建议我可以基于 char 数组创建一个类,并在该类上重载 == 运算符,但由于 string 类已经打包了一堆其他好用的功能,这将是重新发明一个劣质的轮子。 - Hagbard
确实如此。如果您只使用char类型,那么您的代码也不支持Unicode。 - Mark Ingram

0
如果 keyboard1 是一个字符数组,那么 if (keyboard1 == "inv") 就是执行一个简单的指针比较(两者都变成了 char*)。
keyboard1 是一个字符串时,它可以调用一个 operator==(cosnt string&, const char*)(如果存在的话),否则,如果该字符串具有非显式构造函数 string(const char *s),常量 "inv" 将被隐式转换为一个字符串对象,并应用 operator==(const string&,const string&)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接