目录
1. 函数声明与功能
2. 使用示例
3. 注意事项
4. 模拟实现
4.1 第一版:判空+返回值对标strcat+const保证不可修改
4.2 第二版:优化'\0'的单独拼接
1. 函数声明与功能
char * strcat ( char * destination, const char * source );
strcat函数功能:字符串追加/连接;
2. 使用示例
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {char arr1[20] = "hello ";char arr2[] = "world";strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}
运行结果如下:
3. 注意事项
1、源字符串和目标字符串都必须以'\0'作为结束标志,目标字符串(前)末尾的'\0'是追加起始位置的标志,源字符串(后)末尾的'\0'是最终字符串结尾的标志;
以源字符串逐字符初始化(无'\0'字符)为例,调试则程序报错:
2、目标字符串的空间必须足够大以容纳源字符串;
3、目标空间必须可修改(常量字符串、const修饰则报错):
4、关于字符串自己与自己的追加:
(为便于观察,可使用模拟实现的第一版代码进行理解(代码见下文4.1 ))
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>int main() {char arr[10] = "abcdef";my_strcat1(arr, arr);printf("%s\n", arr);return 0;
}
字符串本身与本身追加时,由于dest末尾的'\0'在追加时被覆盖:
从而导致死循环:
最终由于定长的dest字符数组长度而发生越界访问,程序报错:
4. 模拟实现
cplusplus.com关于strcat参数、返回值内容如下:
可知返回值destination为char*类型,是目标字符串(前)空间的起始地址;
cplusplus.com关于strcat内容如下:
strcat - C++ Referencehttps://legacy.cplusplus.com/reference/cstring/strcat/?kw=strcat
4.1 第一版:判空+返回值对标strcat+const保证不可修改
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
char* my_strcat1(char* dest, const char* src) {assert(dest != NULL);assert(src != NULL);// 定位dest字符串的\0:char* ret = dest;while (*dest != '\0') {dest++;}// 将src字符串拼接至dest字符串后while (*src != '\0') {*dest = *src;dest++;src++;}*dest = *src;return ret;
}
int main() {char arr1[20] = "hello ";char arr2[] = "world";my_strcat1(arr1, arr2);printf("%s\n", arr1);return 0;
}
注:assert语句也可简写为:
assert(dest && src);
4.2 第二版:优化'\0'的单独拼接
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
char* my_strcat2(char* dest, const char* src) {assert(dest != NULL);assert(src != NULL);// 定位dest字符串的\0:char* ret = dest;while (*dest != '\0') {dest++;}// 将src字符串拼接至dest字符串后while (*dest++ = *src++); // 循环体内为空语句return ret;
}
int main() {char arr1[20] = "hello ";char arr2[] = "world";my_strcat2(arr1, arr2);printf("%s\n", arr1);return 0;
}