strcat(拼接函数的使用和模拟)
strcat的语法
`strcat` 是 C 语言标准库中的一个字符串拼接函数,它用于将一个字符串(source)拼接到另一个字符串(destination)的末尾。该函数定义在 `<string.h>` 头文件中。
函数原型如下:
```c
char *strcat(char *dest, const char *source);
```
参数说明:
- `dest`:指向目标字符串的指针,拼接后的字符串将存储在这里。
- `source`:指向源字符串的指针,要拼接的字符串。
返回值:
- 函数返回指向目标字符串 `dest` 的指针。
功能:
- 将源字符串 `source` 的所有字符复制到目标字符串 `dest` 的末尾,直到遇到 null 字符(`'\0'`)为止。
- 在拼接过程中,如果目标字符串不以 null 字符结尾,`strcat` 会自动在其后面添加一个 null 字符,以确保拼接后的字符串以 null 字符结束。
示例代码:
```c
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello"; // 确保这个数组足够大,能够存放拼接后的字符串
char source[] = ", World!";
// 使用 strcat 拼接字符串
strcat(dest, source);
printf("Concatenated string: %s\n", dest);
return 0;
}
```
当运行上述代码时,它会输出:
```
Concatenated string: Hello, World!
```
注意事项:
- 与 `strcpy` 类似,`strcat` 也不会检查目标字符串数组是否有足够的空间来存放拼接后的字符串,因此同样要注意避免缓冲区溢出。
- 在实际项目中,为了安全起见,更推荐使用 `strncat` 函数,它允许你指定最大拼接的字符数,从而减少溢出的风险。
- 如果你需要在一个已存在的字符串后面添加一个特定的字符或字符串,可以使用 `strcpy` 和 `strcat` 的组合来实现。例如,如果你想在每个单词后面添加一个逗号和空格,你可以先用 `strcpy` 复制单词,然后手动添加逗号和空格。
也就是理解为
strcat(arr1(前面的函数),arr2(后面的函数))
也就是打印的 时候打印arr1就可以
而且是要给arr1 足够大的空间 这样才能保证后续工作的进行
函数来连接字符串
strcat的模拟
1 找到目标空间‘\0’
2 拷贝数据
3 目标空间可修改
所以简单的说就是先打印 再进行拷贝 两个循环
最后返回的是目标空间的起始地址,
简单的说就是
图解
库里面的参考实现代码
基本上差不多
代码版本1
模拟实现 `strcat` 函数:
```c
char *my_strcat(char *dest, const char *source) {
// 找到目标字符串的末尾
char *dest_end = dest + strlen(dest);
// 将源字符串的字符复制到目标字符串末尾
while (*source) {
*dest_end++ = *source++;
}
// 添加 null 字符,确保字符串以 null 字符结束
*dest_end = '\0';
// 返回指向目标字符串的指针
return dest;
}
int main() {
char dest[20] = "Hello";
char source[] = ", World!";
// 使用模拟的 my_strcat 拼接字符串
dest = my_strcat(dest, source);
printf("Concatenated string: %s\n", dest);
return 0;
}
```
这个模拟实现的基本逻辑与标准库中的 `strcat` 相同,但它不依赖于标准库函数,可以作为了解字符串拼接内部实现的一种方式。
代码版本2
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcat(char* arr1, char* arr2)
{
assert(arr1 && arr2);
char* ret = arr1;//首元素地址 方便返回首元素地址
while (*arr1 != '\0')*arr1++;//这里的++不能写到循环里面 因为这里的++是对比之后进行++ 导致跳出循环 也就是等于当指针等于字符0的时候此时应该跳出循环 但是 ++ 导致又不等于0 指向的是'\0'的后一位
while (*arr1 = *arr2)
{
*arr1++; *arr2++;
}
*arr1 = *arr2;//这里也就是把'\0'放到结尾 其实放不放都可以 因为你已经完成任务 具体的目的要根据实际来进行写
return ret;
}
int main()
{
char arr1[100] = "slaidg ";//拼接的时候 需要注意 这里是常量字符创 也就无法改变空间的 所以 这里arr1的空间 要比arr2的空间大才行 不然会导致程序崩溃
char arr2[] = "dfilsug ";
strcat(arr1, arr2);
printf("%s\n\n", arr1);
char arr3[] = "dfilsug ";
my_strcat(arr1, arr3);
printf("%s\n\n", arr1);
return 0;
}