6.strcat函数
*简单使用
strcat:string concatenate 字符串连接
*网页翻译
函数
strcat
cpp//strcat返回类型char * char * strcat ( char * destination, const char * source );
连接字符串
对目标(destination)字符串 追加源(source)字符串 的一个拷贝,目标字符串 的终止0字符(即\0)**(注意是目标空间的第一个\0)**会被源字符串 的第一个字符覆盖,并且在目标中,0字符(即\0)被包含在由两者连接形成的新字符串的末尾
目标(上方代码定义了destination和source是指针变量) 和源 不得重叠(即地址不能相同)
参数
目标:指向目标数组的指针应该包含C字符串(因为是C语言,所以叫这个名称)而且目标数组应该足够大来容纳追加而成的结果字符串
源:要追加的C字符串,不能和目标重叠(即地址不能相同)
返回值
目标已返回
代码:
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>//string头文件包含strcat
int main()
{
char arr1[20] = { "Hello"};
strcat(arr1, " World!");
printf("%s", arr1);
return 0;
}
x86环境下打开内存窗口
输入&arr1
执行完strcat(arr1, " World!");再次查看
很显然是从Hello\0的\0(0x0136FC01)开始追加字符串的
注:0x0136FC01地址处的20是空格
*例题1
求下列代码执行后arr1的结果
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>//string头文件包含strcat
int main()
{
char arr1[20] = { "Hello"};
strcat(arr1, " \0World!");//\0前有一个空格
printf("%s", arr1);
return 0;
}
答案速查:
分析:
x86环境下打开内存窗口
输入&arr1
执行完strcat(arr1, " World!");再次查看
仅仅追加了\0前的空格就结束了(追加的字符串stcat以最近的\0为结束标志,停止追加)
*例题2
求下列代码的执行结果
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>//string头文件包含strcat
int main()
{
char arr1[20] = { "Hello"};
strcat(arr1, arr1);
printf("%s", arr1);
return 0;
}
答案速查:
分析:
源:要追加的C字符串,不能和目标重叠(即地址不能相同)
自己不能给自己追加!(具体原因见sim_strcat函数的例题3)
*总结strcat函数的使用注意事项
1.格式:char * strcat ( char * destination, const char * source );
2.stcpy从目标空间的第一个\0开始追加,并且覆盖掉\0
3.追加的字符串stcat以第一个\0为结束标志,停止追加
4.自己不能给自己追加
*模拟实现
设计一个函数sim_strcat
destination简写为dest,source简写为src
和strcat函数一样,两个类型为char*的参数,函数返回类型为char*
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
char* sim_strcat(char* dest, const char* src)//const修饰src
{
char* ret = dest;
while (*dest != '\0')
{
dest++;
}//循环停止后dest刚好停在\0的地址处
while (*dest++ = *src++)
{
}//此循环同sim_strcpy函数
return ret;
}
int main()
{
char arr1[20] = { "Hello" };
char* ret = sim_strcat(arr1, " World!");
printf("%s", ret);
return 0;
}
注:strcpy函数见:51.【C语言】字符函数和字符串函数(strcpy函数) 点我跳转
*例题3
把上方代码的char* ret = sim_strcat(arr1, " World!");改为char* ret = sim_strcat(arr1, arr1);
求运行结果
答案速查:
显示已引发的异常
分析:
x86环境下打开内存窗口
输入&arr1
红色字体是属于arr1的
步步执行while (*dest++ = *src++)
填充满arr1后仍然循环!(无限循环导致越界访问)
如果自己追加自己可以用strncat函数