将std :: string与常量进行比较与将char数组与常量进行比较在C ++中

时间:2011-05-15 12:47:44

标签: c++ stdstring arrays

我正在尝试进行一些文本冒险以掌握C ++。

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

如果keyboard1是一个字符串,这将有效,但如果它是一个char数组则不会这样,这是因为我没有在常量的末尾包含null吗?

3 个答案:

答案 0 :(得分: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,这是字符串开始的地址是一个常量字符串(顺便说一句,它由编译器自动终止)。

您应该使用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;
}

这很有效。

答案 1 :(得分:2)

不,它不起作用的原因是因为您将比较代表每个字符串的内存地址。请改用strcmp / wcscmp

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

答案 2 :(得分:0)

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

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