字符串的处理---拷贝,合并,比较(strcpy,strcat,strcmp)

  个人总结常用的相关API函数:

拷贝:strcpy,memcpy,sprintf;strncpy,_snprintf

合并:strcat,sprintf;strncat,_snprintf

比较:strcmp,memcmp;strncmp

 

这里我们只需要分析其中一类的相关函数,同时就可以了解其他类的函数了。

 

首先看看strcpy,memcpy,sprintf三个函数,这三个函数都可以用来进行字符串之间的拷贝操作。

strcpy::Copy a string.

函数原型::

char *strcpy(
   char *strDestination,
   const char *strSource
);

strcpy是拷贝字符串,以/0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止)

memcpy::Copies bytes between buffers.

函数原型:

void *memcpy(
   void *dest,
   const void *src,
   size_t count
);

而memcpy是给定来源和目标后,拷贝指定大小n的内存数据,而不管拷贝的内容是什么(不仅限于字

符)
sprintf ::Write formatted data to a string.

函数原型:

int sprintf(
   char *buffer,
   const char *format [,
      argument] ...
);

sprintf一个可以给定格式的字符串拷贝

 

 

然后我们看一下三个函数的区别:

strcpy只能处理字符串;如果拷贝带有特殊字符的串,就只能用memcpy或memmove。memcpy和memmove

功能基本上差不多,但是当源串和目标串有Overlap时,memmove可以正确处理,memcpy则不行。

另外char   *strcpy() 跟 memcpy() 的区别在于当源地址和目标地址发生重叠时,前者是未定义的,

就依赖于编译器的,后者是先做了一份拷贝,最终是能正确实现的, 前者就不一定了

 

同时我们注意到,在这三个函数中,除了memcpy考虑到源字符串和目的字符串的拷贝长度以外,

strcpy和sprintf都是没有考虑到的,这样在使用的时候很有可能就会因为目的字符串的内存小于源

字符串的内存大小,这将会导致溢出,内存异常导致程序崩溃。

 

这时候我们就可以考虑到使用进行了长度限制的拷贝操作函数,那就是strncpy和_snprintf.

strncpy::Copy characters of one string to another.

函数原型:

char *strncpy(
   char *strDest,
   const char *strSource,
   size_t count
);

_snprintf::Writes formatted data to a string.

函数原型:

int _snprintf(
   char *buffer,
   size_t count,
   const char *format [,
      argument] ...
);

当然,使用这两个函数只是可以保证控制了部分不必要的溢出错误,但是并不能保证拷贝成功,就像

上面strcpy和memcpy的分析,所以,如果需要拷贝字符串,尽量可以考虑使用memcpy

 

最后还可以看到,sprintf和_snprintf两个函数同时出现在了拷贝和合并字符串操作中,它们同事具

有了字符窜拷贝和合并的功能。在将多个源字符串格式化后合并入目的字符串中,如果目的字符串为

空,这时就相当于做了一次格式化的拷贝操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值