目的:字符串读入到string变量
方法1:调用STL方法 构造函数 或 assign(赋值)方法
方法2(待商榷):指针操作 使用scanf("%s", &s[0]) 或 memcpy函数
#include<cstdio>
#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的代码。
探讨了在C++中使用STL库处理字符串的方法,对比了构造函数、assign方法与指针操作如memcpy的区别。指出了直接使用指针操作可能导致的越界问题及对STL封装的破坏,强调了在C++中正确使用STL的重要性。
973

被折叠的 条评论
为什么被折叠?



