当前位置:  开发笔记 > 编程语言 > 正文

string c_str()与data()

如何解决《stringc_str()与data()》经验,为你挑选了3个好方法。

我已经阅读了几个地方,c_str()data()(在STL和其他实现中)之间的区别c_str()是总是空终止而data()不是.据我在实际实现中看到的,他们要么做同样的事情,要么做data()电话c_str().

我在这里错过了什么?在哪种情况下使用哪一个更正确?



1> Scott Langha..:

文档是正确的.使用c_str(),如果你想有一个空结束的字符串.

如果实现data()者按照c_str()你的方式实现你不必担心,仍然使用data()如果你不需要将字符串空终止,在某些实现中它可能会比c_str()更好地执行.

字符串不一定必须由字符数据组成,它们可以由任何类型的元素组成.在那些情况下data()更有意义.c_str()在我看来,当字符串的元素基于字符时,它才真正有用.

额外:在C++ 11及更高版本中,两个函数都必须相同.ie data现在需要以null结尾.根据cppreference:"返回的数组以空值终止,即data()和c_str()执行相同的功能."


额外2:从C ++ 17开始,.data()现在也有一个非常量重载,因此它们不再等效于非常量字符串。

2> mfazekas..:

在C++ 11/C++ 0x中,data()并且c_str()不再是不同的.因此data()也需要在末尾具有空终止.

21.4.7.1 basic_string访问者[string.accessors]

const charT* c_str() const noexcept;

const charT* data() const noexcept;

1返回:指针p,p + i == &operator[](i)对于每个iin [0,size()].


21.4.5 basic_string元素访问[string.access]

const_reference operator[](size_type pos) const noexcept;

1要求:pos <= size().2返回:*(begin() + pos) if pos < size()否则,对具有值charT();的参考值的类型T的对象的引用不应被修改.


@taz即使存储二进制数据,C++ 11也要求`std :: string`为尾随的''\ 0'`分配一个额外的`char`.当你执行`std :: string s("\ 0");`时,`s.data()[0]`和`s.data()[1]`都保证计算为0.

3> Brian R. Bon..:

即使知道你已经看到它们做同样的事情,或者.data()调用.c_str(),假设其他编译器就是这种情况也是不正确的.您的编译器也可能会在将来的版本中更改.

使用std :: string的2个理由:

std :: string可用于文本和任意二进制数据.

//Example 1
//Plain text:
std::string s1;
s1 = "abc";

//Example 2
//Arbitrary binary data:
std::string s2;
s2.append("a\0b\0b\0", 6);

在使用字符串作为示例1时,应使用.c_str()方法.

当您使用字符串作为示例2时,您应该使用.data()方法.不是因为在这些情况下使用.c_str()是危险的,但是因为更明确的是您正在使用二进制数据供其他人审阅你的代码.

使用.data()可能存在陷阱

以下代码错误,可能会导致程序中的段错误:

std::string s;
s = "abc";   
char sz[512]; 
strcpy(sz, s.data());//This could crash depending on the implementation of .data()

实现者为什么常常使.data()和.c_str()做同样的事情?

因为这样做效率更高.使.data()返回非空终止的东西的唯一方法是让.c_str()或.data()复制它们的内部缓冲区,或者只使用2个缓冲区.具有单个空终止缓冲区始终意味着在实现std :: string时始终只能使用一个内部缓冲区.


实际上,.data()的意思是它不应该复制内部缓冲区.这意味着实现不必在\ 0之前浪费char,直到需要它为止.你永远不会想要两个缓冲区:如果你要调用.c_str(),请将一个\ 0附加到缓冲区..data()仍然可以返回该缓冲区.
完全同意使用2个缓冲区将是荒谬的。您怎么知道这就是为什么要使用.data的原因?
推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有