String和内存操作

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 ofmemory whose size is at least n + 1。即长度为nstring对象,其内存空间至少为n+1个字符,且最后一个字符为’/0’

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

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

示例:

#include<iostream>
 
using namespacestd;
 
int main()
 
{
 
        std::string str("teststring");
 
        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;
 
}
 
其输出:
 
teststring  test string
 
11
 
 
 
11
 
teststring  test string
 
11

附录:

内存初始化函数memset()

作用:在一段内存中填充某个给定的值,注意填充时是按照字节顺序填充的,而不是按照元素填充。

此方法是对较大的结构体和数组进行清零操作的一种有效方法。一般用于初始化大块的内存,此时memset远比for循环高效。

函数形式:memset(void *buffer, int c, size_t n)

buffer是需要设置的内存的开始地址;c是期望填充值;n是需要填充的字节数。

例1:一个int

a[10]型变量,则memset(a,100,sizeof(int))此操作后,元素a[0]的每个字节的值都是100,即0x64,二进制表示:

01100100,所以元素a[0]为0x64646464,二进制表示:01100100 01100100 0110010001100100

void main()
 
{ int i,a[20];
 
memset(a,10,5*sizeof(int));
 
for(i=0;i<20;i++)
 
cout< 此函数输出的10个元素并非10,而是每个字节都是00001010组成的int型数。
 
例2:
 
#include
 
#include
 
void main( void)
 
{
 
char buffer[] ="This is a test of the memset function";
 
printf("Before: %s/n", buffer );
 
memset( buffer,'*', 4 );
 
printf("After: %s/n", buffer );
 
}
 
Output
 
Before: This isa test of the memset function
 
After: **** isa test of the memset function
 
 
 
Memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为''或'/0';
 
例:char a[100];
 
memset(a, '/0',sizeof(a));
 
 
 
memset可以方便地清空一个结构体类型的变量或数组。
 
如:
 
structsample_struct
 
{
 
charcsName[16];
 
int iSeq;
 
int iType;
 
};


 

对于变量

structsample_strcut stTest;

一般情况下,清空stTest的方法:

stTest.csName[0]='/0';

stTest.iSeq=0;

stTest.iType=0;

用memset就非常方便:

memset(&stTest,0,sizeof(structsample_struct));

如果是数组:

structsample_struct TEST[10];

则memset(TEST,0,sizeof(struct sample_struct)*10);

Memcpystrcpy

原型:

void *memcpy(void *to, const void *from, size_t count );

char *strcpy(char *dest, const char *src );

memcpy 用来做内存拷贝,可拷贝任何数据类型的数据或对象。

例:char a[100],b[50]; memcpy(b, a, sizeof(b));

注意如果用memcpy(b,a,sizeof(a)),很可能会造成b的内存地址溢出。

Strcpy就只能拷贝字符串,它遇到'/0'就结束拷贝。

例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘/0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。

Strcpy有可指定拷贝个数的版本:char *strncpy( char *to,const char *from, size_t count );

总结:

strcpy

  源字串全部拷贝到目标字串中,包括'/0',但是程序员必须保证目标串长度足够,且不与源串重叠。

strncpy

  如果目标长>=指定长>源长,则将源串全部拷贝到目标串,连同'/0'

  如果指定长<源长,则将截取源串中按指定长度拷贝到目标字符串,不包括'/0'

  如果指定长>目标长,错误!

注意:说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。对于memcpy也是同样的限制。如果拷贝区域有重叠,请使用memmove().


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值