std::string::c_str和std::string::data有什么区别?

17

5
只想指出,在下一个版本的C++ [C++11或C++0x或称之为其他任何名称]中,这两个函数在定义上是同义词。 - Dennis Zickefoose
3个回答

19

c_str() 保证以NUL结尾。而data()则不保证。


我想这一定是我忽略的简单问题 - 谢谢! - fbrereto
1
实际上,它们可能指向相同的东西(不过您不应该依赖它)。 - Zifre
6
@Zifre: 它们可能指向相同的地址,但在执行变异操作(例如 str += "...")后,实现可能会让内部数据缓冲区没有空终止符,并且只有在调用 c_str() 方法时才添加 '\0'。 - David Rodríguez - dribeas
2
请注意,从C++11开始,这个说法不再正确(data()与c_str()相同)。 - Adriweb

6

c_str() 返回一个指向数据的指针,并附加一个NUL字节,以便您可以将返回值用作“C字符串”。

data() 返回指向数据的指针,没有任何修改。

如果您使用的代码假定字符串以NUL终止(例如任何编写以处理C字符串的函数),请使用c_str()。


1

现在在 MS STL 10.0 中似乎没有任何区别,因为我在头文件中看到了这个:

...\Microsoft Visual Studio 10.0\VC\include\xstring

const _Elem *c_str() const
    {   // return pointer to null-terminated nonmutable array
    return (_Myptr());
    }

const _Elem *data() const
    {   // return pointer to nonmutable array
    return (c_str());
    }

所以它们返回相同的内容。


它看起来在 VC 9.0 中也完全相同。 - C.J.
这是当前标准允许的行为,并且下一个标准要求这样做。我怀疑大多数库已经做了一段时间,以准备更改。 - Dennis Zickefoose

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