stl::string与二进制数据

原文地址 http://www.cnblogs.com/zhenjing/archive/2011/01/30/string_binary_data.html

[C++再学习系列] stl::string与二进制数据

2011-01-30 14:14 by zhenjing, 3108 阅读, 0 评论, 收藏编辑

C99有很多和string相关的函数,如strcat,strchr,strcmp,strcpy,strlen,strncat,strncmp,strncpy等。然而使用C++编程时,所有和string相关的操作均可以使用string类的相关接口完成,string提供和原来C接口类似的功能和性能,同时提供更高的安全性。

String类有一个特性:a string of length n must manage a block of memory whose size is at least n + 1。即长度为nstring对象,其内存空间至少为n+1个字符,且最后一个字符为’\0’

不过在进行string操作时,有一点必须牢记:C/C++语言的string是以’\0’结尾的,对不以’\0’结尾的string进行操作容易引发错误,甚至导致内存溢出等crash

C++的string类,除了用于处理常规string操作外,其本身也可用于存储各种数据,如文件数据。使用者采用string( const char* str, size_type length ); 来封装特定长度的char*数据块。String类的各种运算符将保证数据传递的完整性,即string对象。

示例:

#include <iostream>
using namespace std;
int main() {
std::string str( "test string" );
cout<<str<< "  " <<str.c_str()<<endl;
cout<<str.size()<<endl;
char * buf = new char [str.size()+1];
memset (buf, 0, sizeof (buf));
string test(buf, str.size());   // 封装非字符数据
cout<<test<< "  " <<test.c_str()<<endl;
cout<<test.size()<<endl;
memcpy (buf, str.c_str(), str.size());
test = string(buf, str.size());   // 封装字符数据,并自动加上 ’\0’ 结束符
cout<<test<< "  " <<test.c_str()<<endl;
cout<<test.size()<<endl;
return 0;
}

 

其输出:

test string   test string

11

11

test string   test string

11

说明:这个例子说明:当使用string( const char* str, size_type length );来构造string对象时,string对象的长度由外部指定,数据则来自str,如果length大于str地址范围,可能引发crash!

这个例子也说明了string可用于封装数据,即使是’\0’的数据。因此,string类可以用于存储各种数据,字符串、非字符串(图片,视频)等数据。

注意:将数据拷贝到内存时,不要使用strcpy, 应该使用memcpy,因为strcpystrncpy碰到’\0’将认为拷贝结束。总之,不要使用和str***相关的函数去操作内存数据,除非数据只能是string(memcpy完全可拷贝任何数据)。

---------------------------------------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值