int main() { char arr[100] = "abcde"; strcat(arr, arr); printf("%s\n", arr); //a b c d e \0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 //a b c d e a b c d e a b c d e a b c d e a b c d e 越界 }void My_strcat(char arr[], char brr[]) { int i, j; for (i = 0; arr[i] != '\0'; i++); for (j = 0; brr[j] != '\0'; i++, j++) { arr[i] = brr[j]; } arr[i] = brr[i]; }无论是库函数strcat,还是手动实现的My_strcat,都存在同样的问题
那是什么原因造成的呢?
我们先来分析一下:
首先我们要知道strcat的工作流程:
(1)先遍历目标字符串,先找到它的'\0'
(2)再把源字符串的内容,从'\0'开始复制到目标字符串
(3)同时将源字符串的'\0'加到目标字符串末尾
其次执行strcat(arr,arr),目标字符串和源字符串是同一内存,就会导致:
(1)strcat找到目标arr的'\0'
(2)源arr从'\0'开始复制到目标arr,
这就导致了:找不到'\0',发生了越界中断
//a b c d e \0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
//a b c d e a b c d e a b c d e a b c d e a b c d e 越界
strcat怎么解决自己连接自己的问题
方法一:提前开辟一片空间
提前开辟一片空间,将brr和'\0'都保存起来,不会造成覆盖和死循环
void My_strcat(char arr[], char brr[]) { char crr[1000];//空间要足够大 strcpy(crr, brr); strcpy(arr + strlen(arr), crr);//1+arr长度,继续接着这个复制 }方法二:提前知道brr的长度
void My_strcat(char arr[],char brr[]){ int len=strlen(brr);//先确定brr长度 while(*arr) arr++;//先走到arr'\0'的位置 while(len--) *arr++=*brr++; *arr='\0'; }方法三:不覆盖arr的‘\0’
从后往前覆盖 不会造成这种现象
brr:a b c d e \0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
arr:a b c d e a b c d e \0
void My_strcat(char arr[],char brr[]){ int len1 = strlen(arr);//5 int len2 = strlen(brr);//5 char* p = arr + len1 + len2;//11 char* q = brr + len2;//6 int t = len1 + 1;//6 加上'\0' while (t--) { *p--=*q--; } }