C/C++字符串处理

目录

 

1 snprintf函数

2 转换函数比较

3 string中函数的用法


1 snprintf函数

1、写入目标串的字符数不超过size,包括'\0'

2、必须格式化参数,防止源串包含%s等格式化字符,会在后面寻找字符串指针,若未找到,会出现非法内存访问

3、必须判断返回值,避免写溢出(目标串str是字符数组,如果不以'\0'结束,对函数返回值ret(即预写入字符个数)进行src[ret]写入,会出现写越界,索引ret位不存在)

4、使用sizeof设置size(sizeof会计算'\0',sizeof(str) = strlen(str) +1)

5、无论被复制的源串是否截断,都会在目标串末尾添加终止符'\0',而返回值是预写入的字符数,并不包含终止符

6、字符串写成字符,编译只会警告,运行就会coredump。因为'ww'的函数没被准确定义。如snprintf(buf,sizeof(buf),"%s",'ww')

 

2 转换函数比较

itoa函数:没对char*进行越界检查,可能造成数组溢出

snprintf函数: 会对数组进行越界检查,效率高。使用snprintf函数时,一定要记得格式化参数%s,不然在处理特殊字符串时会出core;对返回值进行判断,否则会导致越界

stringstream类: 采用内存自动管理机制,最安全,具有模板亲和力,可用于泛型编程。但使用临时对象,有性能开销,效率较低。大于0转换成功,等于0转换失败,对应s头文件:#include<sstream>

 

3 string中函数的用法

c_str():生成一个const char*指针,指向以空字符终止的数组,这个数组的数据是临时的,当有一个改变这些数据的成员函数被调用后,其中的数据就会失效。  //c = s.c_str();  推荐:strcpy(c,s.c_str())

data():c_str类似,但返回的数组不以空字符终止

copy(p,n):从string类型对象中至多复制n个字符到字符指针p指向的空间中,要保证p中有足够的空间存储n个字符

assign(const string& str, size_t pos, size_t n):将str的内容从位置pos起的n个字符作为原字串的新内容赋给原字串

assign(const string& str):将str替换原字串的内容

strstr(str1, str2):函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL

string中reserve和resize的区别:void reserve( size_type size = 0 ):在发生realloc前能允许的最大元素数,即预分配的内存空间,仅仅只是修改了capacity的值,如果设置的size小于字符数,那capacity正好等于字符数,影响capacity;void resize( size_type size, char val = char() ):设置字符串的size为size大小,原来多余的会截掉,如果大于原来的size,默认以0填充,如果val指定,以val填充,影响size

4 常见函数

void *memset(void *s,   int c, size_t n):作用是在一段内存块中前n个字节填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法

char *strchr(const char* _Str,char _Val):返回首次出现_Val的位置的指针,返回的地址是被查找字符串指针开始的第一个与Val相同字符的指针,如果Str中不存在Val则返回NULL

void bzero(void *s,size_t n):将内存空间s的前n个字节置零(包括   ‘\0’),无返回值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值