c_str()vs std :: string - 这段小代码的真正区别是什么?

时间:2017-01-18 14:01:41

标签: c++ string c++11 std string-comparison

为什么以下代码打印"否"?

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

void main()
{
    const std::string abc = "hello";

    if (abc.c_str() == "hello")
    {
        cout << "\nYES";
    }
    else
    {
        cout << "NO";
    }
}

.c_str()会返回const char*"hello"应该被解释为const char*std::string,两者都有效。但为什么不打印&#34;是&#34;。相反,strcmp()会打印&#34;是&#34;但我的问题是上面的代码,这是一个编译器错误吗?

4 个答案:

答案 0 :(得分:3)

  

&#34;你好&#34;应该被解释为const char *或std :: string都是有效的。

没有。 "hello"永远不会被解释为std::string。它的类型为const char[6],在这种情况下会转换为const char*。这种数组转换称为衰减。

  

但为什么不打印YES。

比较两个指针时,比较它们是否指向同一个对象。您使用的指针比较不相等,因为字符串文字和std::string的缓冲区不是同一个对象。

  

这是编译器错误吗?

没有。这是您代码中的错误。

  

那么你会建议使用c_str()和std :: string?

的正确方法

正确的方法是比较空终止字符数组的内容是std::strcmp

或者,您可以直接使用带有std::string的比较运算符,而不使用c_str返回的指针。 std::string的比较运算符与空终止字符串的内容进行比较。

答案 1 :(得分:3)

它不是编译器错误。 abc.c_str()给你一个指向std::string数据缓冲区的指针的值,而且从C ++ 11开始,它不可能与文字地址{{ 1}}因为该标准禁止"hello"的写时复制语义。 (我认为这在理论上可能在C ++ 03及更早版本中出于兴趣。)

如果您想将文字与std::string进行比较,请使用

std::string

由于if (abc == "hello")std::string运算符有适当的重载。

答案 2 :(得分:2)

abc.c_str()是指向abc对象的内部缓冲区的指针,然后您将使用返回false的字符串文字“hello”进行指针比较。

答案 3 :(得分:1)

你正在比较错误的方法,试试:

而不是:

if (abc.c_str() == "hello")

使用:

if (!strcmp(abc.c_str(), "hello"))