C语言随笔(strcat的实现)

今天看C语言教程的时候,看到有关指针,字符串数组的时候,发现一个有意思的函数---strcat  

char *strcat( char *strDestination, const char *strSource );   此函数的功能是,把strSource的字符串 放在strDestination后面,并且覆盖strDestination的\0字符串

在网上搜索了好多的实现方法,主要的有以下几种。

1.

#include "stdio.h"

char *strcat(char *str1,char * str2)

{

if((str1 == NULL) || (str2 == NULL))      throw("Invalide arguments");  

       char * pt = str1;

while(*str1 != '\0') str1++;

while(*str2 != '\0') *str1++ = *str2++;

*str1 = '\0';

return pt;

}

void main()

{

char a[] = "markyuan";

char b[] = "yyyyyy";

char *cat = strcat(a,b);

printf("%s\n",cat); 

}

看完这段代码之后感觉一定是有错误的,首先 如果把一个字符串添加到另一个字符串中,执行相关函数之后,怎么能让参数str1改变呢。这是不希望看到的。

还有  while(*str2 != '\0') *str1++ = *str2++;   这一句。不停地在str1后面增加数据,当str2非常大的时候,超过了str1字符串数组的范围,造成越界,这不就会污染其他的变量,对本程序有害嘛。

所以上述代码问题多多。

2.列举出书上的代码

 char *strcat(char *s1,register const char *s2)
{
     register char  *p = s1;
     while(*p) 
     ++p;
     while(*p++ = *s2++)
     ;
     return s1;
}
非常让人敬佩仅仅几行。太……了。
首先上面的代码解决了 改变 s1指针的问题,先寄给p然后再操作p最后返回的是s1 而操作之后,通过p改变了字符串,此时s1指向的是修改过的。
对于 while(*p++ = *s2++) 这条语句,经过再三分析感觉,越界问题应该不存在,str系列函数调用时要自行保证\0结尾和有足够的内存.而且现在的大部分编译器都推荐使用带n的str系列函数 总而言之,如果使用 strcat函数,那么是否越界也就是p指向的内存是否够用,要靠调用者来保证(坑爹)。就是给s1分配足够大的内存。当然可以利用求界函数,例如 strlen进行求值,得到范围之后进行修改。
说到str系列函数,例如strcmp strcat sttcpy都是遇到\0就结束,像strcpy函数遇到\0就结束拷贝。但是通过memcpy就不必考虑这种情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值