STRNCAT:重写strncat()
#include <stdio.h>
#include <string.h>
int main()
{
char str[23];
memset(str,0,sizeof(str));
strcpy(str,"ssc_");
printf("str=%s \n",str);
STRCAT(str,"zcys");
printf("str_cat=%s \n",str);
STRNCAT(str,":kobe",8);
printf("str_ncat_1=%s \n",str);
STRNCAT(str,"_bryanthhh",7);
printf("str_ncat_2=%s \n",str);
return 0;
)
char *STRNCAT(char* dest, const char* src, size_t n);
char *STRNCAT(char* dest, const char* src, size_t n)
{
int len=0;
//计算应该追加多少字符
if(strlen(src)>n) len=n;
else len=strlen(src);
int i=0;
int dest_len=strlen(dest);
for(i=0;i<len;i++)
{
dest[dest_len+i]=src[i]; //每次循环,dest_len的值不变
/* 错误写法 */
//printf("stelen=%d,strlen+i=%d\n",strlen(dest),strlen(dest)+i);
//dest[strlen(dest)+i]=src[i];//不能用strlen,strlen(dest)这个值在变化
}
dest[dest_len+i]=0;
/* 错误写法 */
//dest[strlen(dest)+i]=0;
return dest;
}
输出:
错误代码:
错误输出:
错误输出是因为:如果使用strlen(dest),每次循环后strlen(dest)都会改变。但其实在第二次循环,i=1时,因为此时strlen(dest)已经比i=0时增加了1,而i也增加了1,所以strlen(dest)+i就增加了2(程序中的值为10,所以是将src[1]的值k赋给了dest[10]),跳过了dest[9]的赋值,而dest[9]=0,所以输出截至到dest[9]就结束了。第二次是恰巧给dest[9]赋值“_”,然后又跳过dest[14],所以之后的赋值还是无效。
可以使用gdb进行调试,b-打断点(在for循环处),r-运行程序,s-进入函数(for循环),n-单步调试。