C++ std::string::resize()方法是否管理终止字符?

C++ std::string::resize()方法是否管理终止字符?,c++,string,c++11,C++,String,C++11,我正在将一些数据从一个流复制到一个字符串中,因此我考虑用实际的字符数加上一个终止字符来调整字符串的大小,如下所示: std::istringstream stream { "data" }; const std::size_t count = 4; std::string copy; copy.resize(count + 1); stream.read(&copy[0], count); copy[count] = 0; 但是,在本例中,copy表示它的大小为5(这是一致的,因为

我正在将一些数据从一个流复制到一个字符串中,因此我考虑用实际的字符数加上一个终止字符来调整字符串的大小,如下所示:

std::istringstream stream { "data" };
const std::size_t count = 4;

std::string copy;
copy.resize(count + 1);

stream.read(&copy[0], count);
copy[count] = 0;

但是,在本例中,
copy
表示它的大小为
5
(这是一致的,因为我调用了
resize(5)
)。这是否意味着
resize()
将添加额外的终止字符本身?这意味着我不必担心在调用
读取(&data[0],count)
之后追加
\0

不,您不必这样做。
string
类抽象了“以null结尾的字符序列”的概念,这样您就不必再担心这个问题了

此外,返回的字符串的大小不包括终止字符,这与我提到的行为一致,因为如果不必处理终止字符,就不必知道它。您的字符串就是您想要操作的字符,而不必担心与实际数据无关的“实用”字符。

标准中引用的§21.4.7.1基本字符串访问器[string.accessors]表明
std::string
具有保证的空终止缓冲区

同样根据标准§21.4.4/6-8基本字符串容量[字符串容量]:

void resize(尺寸类型n,图表c)

6
需要:
n max\u size()

8
效果:更改
*this
指定的字符串长度,如下所示:

-如果
n size()
,函数将用长度
n
的字符串替换
*this
指定的字符串,该字符串的第一个
size()
元素是
*this
指定的原始字符串的副本,其余元素都初始化为
c

void resize(大小\类型n)

9
效果:
调整大小(n,charT())

解释上述
std::string::resize
不会影响字符串缓冲区的终止空字符

现在转到您的代码:

语句
std::字符串副本
定义一个空字符串(即,
copy.size()==0

语句
copy.resize(计数+1)(n==5)>0
将用长度为5的字符串替换副本,该字符串填充
\0
(即空字符)

现在在语句
stream.read(©[0],count)中
std::stream::read
将只复制数据块,而不检查其内容,也不在末尾附加空字符

换句话说,它将仅用“数据”替换
copy
的前4个空字符。
copy
的大小不会改变,它仍然是一个5大小的字符串。也就是说,
copy
的缓冲区的内容将是“data\0\0”


所以调用
copy[count]=0是多余的,因为
复制[4]
已经
\0
。但是,您的字符串不是“data”,而是“data\0”

C++11及更高版本的
std::string
保证缓冲区以null结尾。