代码如下图所示,在main函数中,有两个string类型的变量,其中一个变量str1我直接初始化,另一个变量str2我没有初始化,但是string类型调用默认构造函数,使得str2 = "\0",是这样吧。我对str1的首字符进行了变换,然后用cout可以在后面输出,为什么我对str2的首字符进行变换后,再用cout输出,但是没有得到正确的输出啊。请问这是怎么回事啊?谢谢。
#include <iostream>
#include <string>
int main()
{
std::string str1 = "test";
std::string str2;
if (str2[0] == '\0')
std::cout << "yes" << std::endl;
str1[0] = 'a';
str2[0] = 'b';
std::cout << str1 << '\n'
<< str2 << '\n';
str2[1] ='\0';
std::cout << str1 << '\n'
<< str2 << '\n';
return 0;
}
运行结果:
根据你的题意.
你创建了 str1 ,他是指向五个byte的.
而str2 是空的.
所以
你用str1[0]\str1[1]\str1[2]\str1[3]\str1[4] 都没什么问题
但是,你用 str2[0] 就有问题了.他其实未指向什么内存.
个人建议.
你用C++,不建议用C语言里数组下标来访问.
使用string自带的一些函数来访问会更好.
你在输出的时候,改为输出 str2.data()试试
str2[0] = 'b'; 这个操作应不应该有效呢?这个问题值得思考
因为目前str2是一个空字符串,也就是empty()==true;
那么它的size()应该就是0,而str2[0]是对第一个元素的访问。
这个实际是和std::string的实现是相关的,你可以试一下,部分编译器自带的实现,在这种操作下会出现错误。