C++ memcpy的结果(“x[0],“fsd”,3) 字符串x; 78倍储备(100); 79 x[0]=“1”; 80 x[1]=“2”; 81 x[2]='\0'; 82 x(3); 83 cout
C++ memcpy的结果(“x[0],“fsd”,3) 字符串x; 78倍储备(100); 79 x[0]=“1”; 80 x[1]=“2”; 81 x[2]='\0'; 82 x(3); 83 cout,c++,C++,std::string不一定将其数据存储为C字符串,即附加\0。相反,字符串的长度在内部保持不变。如果您更改了内容,这很好,但是resize()不知道有实际数据,因为从string的角度看,长度仍然是0。引述: 如果n大于字符串的当前长度,则会根据需要添加尽可能多的c字符实例来扩展内容,以达到n个字符的大小 此调用中的c字符是\0,因此resize()实际上会将字符串更改回空字符串 这是正确的行为,因为不支持以这种方式直接修改std::string的内容。使用运算符[],追加等等。std::st
std::string
不一定将其数据存储为C字符串,即附加\0
。相反,字符串的长度在内部保持不变。如果您更改了内容,这很好,但是resize()
不知道有实际数据,因为从string
的角度看,长度仍然是0。引述:
如果n大于字符串的当前长度,则会根据需要添加尽可能多的c字符实例来扩展内容,以达到n个字符的大小
此调用中的c
字符是\0,因此resize()
实际上会将字符串更改回空字符串
这是正确的行为,因为不支持以这种方式直接修改
std::string
的内容。使用运算符[]
,追加
等等。std::string
不一定将其数据存储为C字符串,即追加了\0
。相反,字符串的长度在内部保持不变。如果您更改了内容,这很好,但是resize()
不知道有实际数据,因为从string
的角度看,长度仍然是0。引述:
如果n大于字符串的当前长度,则会根据需要添加尽可能多的c字符实例来扩展内容,以达到n个字符的大小
此调用中的c
字符是\0,因此resize()
实际上会将字符串更改回空字符串
这是正确的行为,因为不支持以这种方式直接修改
std::string
的内容。使用操作符[]
,附加
等等。你应该花点时间确保你确实提出了一个问题,同时保持标题和问题的同步。至于什么可能让您困惑(您的代码让我困惑),std::string::resize()
将用“\0”填充创建的新元素,覆盖您以前的编辑。将resize()
移动到作业上,您会没事的。您应该花点时间确保您确实提出了一个问题,同时保持标题和问题的同步。至于什么可能让您困惑(您的代码让我困惑),std::string::resize()
将用“\0”填充创建的新元素,覆盖您以前的编辑。将resize()
移动到作业上,您就会没事了
string x;
78 x.reserve(100);
79 x[0] = '1';
80 x[1] = '2';
81 x[2] = '\0';
82 x.resize(3);
83 cout << "sdfs: " << x.c_str() << endl;
84 cout << &x[0] << endl;
85 return 0
这只是为字符串保留内存。这意味着现在您可以向字符串追加100个字符,而无需重新分配字符串内存
这不会更改字符串的大小x
仍然是一个空字符串
这是对索引的越界访问(如果实现不提供运行时检查,您可以不受限制,因为您已经保留了内存)
这将生成一个有效字符串,长度为3个字符,每个字符具有默认值('\0'
)
这只是为字符串保留内存。这意味着现在您可以向字符串追加100个字符,而无需重新分配字符串内存
这不会更改字符串的大小x
仍然是一个空字符串
这是对索引的越界访问(如果实现不提供运行时检查,您可以不受限制,因为您已经保留了内存)
这将生成一个有效字符串,长度为3个字符,每个字符都具有默认值(
'\0'
)。文章的标题和文本不同步。文章的标题和文本不同步。此答案比问题(如果有)更令人困惑。此答案比问题(如果有)更令人困惑。
78 x.reserve(100);
79 x[0] = '1';
80 x[1] = '2';
81 x[2] = '\0';
82 x.resize(3);