strcpy函数和strcat函数的使用及实现
关于strcpy函数和strcat函数的使用、实现
- 一、strcpy函数
- 1.1代码展现
- 1.2注意要点
- 1.2.1源字符串必须以\0结束
- 1.2.2会将源字符串中的\0拷贝到目标空间
- 1.2.3目标空间必须足够大,以确保能够存放源字符串
- 1.2.4目标空间必须可改变
- 1.3实现
- 二、strcat函数
- 2.1代码展现
- 2.2注意要点
- 2.2.1目标空间必须有足够大的空间
- 2.2.2源字符串必须以\0结束
- 2.2.3目标空间必须可改变
- 2.2.4不能自己给自己追加
- 2.3实现
一、strcpy函数
strcpy函数的作用是复制字符串,strcpy是C语言的一个标准库函数 ,strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char*。它是string copy(字符串复制)的缩写。
1.1代码展现
#include<stdio.h>
int main()
{char arr1[] = "abcdefghi";char arr2[] = "boy";strcpy(arr1, arr2);//我们要把arr2拷贝到arr1中,希望arr1变成boy,而不是boydefghi,所以要把arr2的\0也拷贝过去printf("%s", arr1);return 0;
}
1.2注意要点
1.2.1源字符串必须以\0结束
举个反例,见代码:
#include<stdio.h>
int main()
{char arr1[] = "abcdefghi";char arr2[] = {'b','o','y'};strcpy(arr1, arr2);//源字符串arr2中不包含\0,当程序运行起来的时候,会一直往后越界访问,直到遇到\0,函数才会结束printf("%s", arr1);return 0;
}
程序会紊乱,arr1将变得很“奇怪”!
1.2.2会将源字符串中的\0拷贝到目标空间
arr2中的’b’,‘o’,‘y’,'\0’一起被拷贝到arr1中,并替换掉arr1中的前四个元素。
(实际上是arr1变成了 ‘b’ ‘o’ ‘y’ ‘\0’ ‘e’ ‘f’ ‘g’ ‘h’ ‘i’ ‘\0’,遇到第一个\0便不再往下访问了,所以arr1打印出boy)
1.2.3目标空间必须足够大,以确保能够存放源字符串
举个反例,见代码:
#include<stdio.h>
int main()
{char arr1[] = "a";char arr2[] = "boy";strcpy(arr1, arr2);//源字符串比目标字符串大,当函数运行起来的时候会越界访问,程序报错printf("%s", arr1);return 0;
}
程序报错:
1.2.4目标空间必须可改变
同样举个反例:
#include<stdio.h>
int main()
{char* arr1 = "abcdefghi";char arr2[] = "boy";strcpy(arr1, arr2);//目标字符串arr1内容不可被改变,此时运行程序会崩溃printf("%s", arr1);return 0;
}
程序崩溃,在visual studio2022不输出任何内容。
1.3实现
//模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{assert(dest);assert(src);char* ret = dest;//拷贝src指向的字符串到dest指向的空间,包括\0while (*dest++ = *src++)//比如当把元素b拷贝过去时候,该式子的结果就是b,把\0拷贝过去时,结果就是0{;}//返回目的地的空间的起始地址return ret;
}
int main()
{char arr1[] = "abcdefghi";char arr2[] = "boy";my_strcpy(arr1, arr2);printf("%s", arr1);
}
二、strcat函数
strcat是字符串连接函数,把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除* dest原来末尾的“\0”)。要保证* dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。
2.1代码展现
#include<stdio.h>
int main()
{char arr1[20] = "hello";char arr2[] = "world";strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}
2.2注意要点
2.2.1目标空间必须有足够大的空间
目标空间要容得下目标空间的字符串加上源字符串
举个反例:
#include<stdio.h>
int main()
{char arr1[] = "hello";char arr2[] = "world";//目标空间必须足够大。目标空间太小了,无法容下helloworldstrcat(arr1, arr2);printf("%s\n", arr1);return 0;
}
此时程序报错:
2.2.2源字符串必须以\0结束
这里的道理和上面strcpy函数一样,不再举例了。(见上文1.2.1)
2.2.3目标空间必须可改变
道理同样和strcpy函数一样,也不再重复了。(见上文1.2.4)
2.2.4不能自己给自己追加
(请参考下面的图和实现代码)
当使用strcpy,arr1自己给自己追加时,'h’覆盖了‘\0’,于是arr1就没有\0了,于是这个函数永远都不会停下来,程序崩溃!
2.3实现
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* ret = dest;//1、找到目的字符串的\0while(*dest!='\0'){dest++;}//2、追加while(*dest++=*src++){;}return ret;
}
int main()
{char arr1[30] = "hello";char arr2[] = "world";//调试时打开监视,若某一个x变成了\0,则说明\0也被传递过去了。my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}
strcpy函数和strcat函数的使用及实现相关推荐
- c语言 strcpy原型,浅谈C语言中strcpy,strcmp,strlen,strcat函数原型
实例如下: //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, cons ...
- strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数
strcpy函数: char *strcpy(char *Dest , const char *Src) { assert((Dest != NULL) && (Src != NULL ...
- strcpy函数和strcat函数
strcat函数: 将两个char类型连接. char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s); 结 ...
- strlen函数,strcpy函数,strcat函数,memset函数,strcmp函数,memcpy函数,memove()函数
文章目录 一,strlen函数(库函数头文件<string.h>) 二,strcpy函数(库函数头文件<string.h>)拷贝函数 三,strcat函数(头文件是<st ...
- 字符串函数:strlen函数,strcpy函数,strcat函数,strcmp函数
目录: 1.字符串函数strlen (1)strlen函数 (2)strlen的使用 a.代码 b.运行结果 (3)模拟实现strlen函数 a.代码 b.运行结果 (4)注意: 2.字符串函数str ...
- strcpy.strcmp.strlen.strcat函数的实现
#include <stdio.h> #include <string.h> char *copy(char *a,char *b);//声明一个复制函数 char *cat( ...
- C语言 strcat 函数 - C语言零基础入门教程
目录 一.strcat 函数简介 二.strcat 函数原理 三.strcat 函数实战 四.注意 strcat 函数崩溃问题 五.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 ...
- strcat函数oracle,实现strcat函数
关于C语言字符串函数使用的一点心得 就字符串的拼接函数为例strcat. 原型:extern char *strcat(char *dest,char *src);用法:#include <st ...
- strcat函数及其模拟
strcat是字符串追加函数 1.strcat函数的参数以及返回值 1.1参数: 函数的参数分别是目的(destination)字符串的地址,以及被拼接(source)的字符串的地址. 此外,由于我们 ...
最新文章
- 1分钟构建API网关日志解决方案
- Windows 下安装 Redis
- netlink怎么读_ovs源码阅读--netlink使用
- boost::hash_combine模块实现json哈希值的测试程序
- android资源包混淆,Android---andresguard资源混淆
- Windows Mobile 6中禁用键盘或者是禁用某些按键(C#)
- 构建之法:1、2、3章阅读后感
- python在线编辑器-在线python编辑器
- python中arcpy_如何使用ArcPy?
- Python 数据可视化学习笔记 之高维数据可视化及其方法
- 预充电电路工作原理_变频器整流回路 为什么要预充电电路-工业支持中心-西门子中国...
- ACM比赛完了后怎么办
- SAP中通过定制开发在寄售结算MRKO中实现发票校验功能
- Admiral UVA - 1658
- 12条标准判定穷富:整天工作的人当不了富翁
- 华为内部的项目管理之沟通流程
- INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at 错误的解决方法
- What inspires designers? Preferences on inspirational approaches during idea generation
- IOS app自动化
- 可怕 !FaceBook 工程师上班跳楼自杀,北美这是怎么了