(C++)正确地给string类型变量赋值
⽬的:字符串读⼊到string变量
⽅法1:调⽤STL⽅法 构造函数 或 assign(赋值)⽅法
⽅法2(待商榷):指针操作 使⽤scanf("%s", &s[0]) 或 memcpy函数
#include<cstdio>
c++string类型#include<cstring>
#include<string>
#include<vector>
int main(){
std::string stl_str("I'm a string.");
char c_str[20] = "I'm a string.";
std::string obj_str;
memcpy(&obj_str[0],c_str,20);
printf("stl_str Content:%s Size:%d Capacity:%d\n", stl_str.c_str(), stl_str.length(), stl_str.capacity());
printf("mem_str Content:%s Size:%d Capacity:%d\n", obj_str.c_str(), obj_str.length(), obj_str.capacity());
return 0;
}
运⾏结果:
stl_str Content:I'm a string. Size:13 Capacity:13
mem_str Content:I'm a string. Size:0 Capacity:0
⽅法2实际上已经造成了越界操作!!
string提供的capacity⽅法返回已经分配给该串的存储空间。通过内存拷贝的操作我们发现string⽆论是⼤⼩还是容量都没有任何变化。内存拷贝破坏了STL的封装。假如该string后存放有其他变量,那么它们很容易就被破坏掉,⽽根本⽆法发现问题的根源所在。另外,此时通过string的size或length⽅法进⾏循环判断时,会发现根本⽆法进⼊循环。原因就是STL根本没有察觉到分配给⾃⼰的内存已经被改掉了,因此string的长度仍为初始值。
正确赋值操作:
char cstr[10] = "A string";
string s;
s = cstr 或 s.assign(cstr) //assign 与 = 等价
如何避免类似问题:
把C++看作⼀个语⾔联邦(出⾃《Effective C++》)
四种语⾔分别为:过程性的传统C语⾔、⾯向对象部分、模板类,以及STL。
每当在四种编程形式中切换时,都要时刻注意四种形式的不同特点。
显然,传统C的指针操作在STL的领域中是未定义的。那么,我们就绝对不能写出类似于⽅法2的代码。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论