(C++)正确地给string类型变量赋值

探讨了在C++中使用STL库处理字符串的方法,对比了构造函数、assign方法与指针操作如memcpy的区别。指出了直接使用指针操作可能导致的越界问题及对STL封装的破坏,强调了在C++中正确使用STL的重要性。

目的:字符串读入到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的代码。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值