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(©[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(©[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结尾。