sir*_*iri 5 c++ arrays string char
int main(int argc, char const *argv[])
{
const char *s1 = "hello";
string s2;
s2 = s1;
s2.reserve(10);
s2[5] = '.';
s2[6] = 'o';
s2[7] = '\0';
cout << "[" << s1 << "] [" << s2 << "]" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码无法s2正确打印.而不是hello.o它hello始终打印.s2在第一次任务之后,似乎遗体的大小始终为5.为什么会这样?
Ben*_*ley 10
operator[]没有调整字符串的大小.而你对索引5,6和7的调用超出了范围和未定义的行为.使用resize字符串设定为特定大小,或push_back或operator+=追加字符.
另请注意,您无需std::string手动终止零.该课程将自行处理.虽然如果你真的想要它们,你可以在那里嵌入零,并且它们将被视为字符串长度的一部分.
s2.reserve(10);根本不会增长字符串,它只是告诉容器为至少字符保留足够的内存10.它没有任何东西填满保留的空间.
因此,当您对其进行索引时,s2[5]您基本上在"已使用"字符串的边界(即其大小)之外进行索引,这是未定义的行为.
要调整大小,您可以使用s2.resize(10);.这将适当地分配和填充字符串,其大小为10.要同时分配和插入字符,您还可以使用push_back()或operator+=.
旁注:s2[7] = '\0';不需要.本string类管理内部所需要的方法,如任何NUL终端c_str()等你并不需要自己添加NUL.
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |