C/C++ strcpy函数详解
一、题目:
已知strcpy函数的原型是:
char * strcpy(char * strDest,const char * strSrc);
1.不调用库函数,实现strcpy函数。
2.解释为什么要返回char *。
二、标准答案:
char *strcpy(char *strDest, const char *strSrc)
{
assert((strDest!=NULL) && (strSrc !=NULL)); // 2分
char *address = strDest; // 2分
while( (*strDest++ = * strSrc++) != '\0' ) // 2分
NULL ;
return address ; // 2分
}
三、个人解析:
1、出现字符重叠。 例如:strcpy(str+1, str)
2、返回值char* 是实现链式表达式。 链式表达式(方便用strlen计算字符串的长度)
四、个人改进:
注:strlen 计算字符串以\0或者0结束
char *strcpy(char *strDest, const char *strSrc)
{ if (des == NULL || src== NULL)
return NULL;
char* tmp = des;
int len = strlen(src);
memcpy(des, src, len);
return tmp;
}
六、扩展深入了解字符串创建:
char c1[3] = "abc";
char c2[9] = "12345678";
char* c4 = c2;
char* c6 = new char[6];
for (int i=0; i<5; i++)
{
c6[i] = i+1;
}
c6[5] = '\0';
delete c1; 报错,因为"abc" 存储在栈上自动释放。
delete c2; 报错,因为"12345678" 存储在栈上自动释放。
delete c4;报错,虽然c4在堆上new了一块内存,但是我们把他的指向修改到栈上"12345678" 的内存,所以报错,
但是c4开始new的内存出现内存泄露。
delete c6;正确,因为new是在堆上
五、举一个内存重叠例子:
#include<stdio.h>
void Copy(int *a, int *b,int len)//b从开始复制len个数字到a
{
int i ; //为了更突出问题,这里不进行参数检查
for (i = 0; i < len; i++)
{
a[i] = b[i];
}
}
int main()
{
int i;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
Copy(&arr[3], &arr[0], 7); //1,2,3,1,2,3,4,5,6,7
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
C/C++ strcpy函数详解相关推荐
- strcpy()函数详解
strcpy()函数是C语言中的一个复制字符串的库函数,以下将详细解释说明一下: · 函数声明以及实现代码 char *strcpy(char *dst, const char *src); char ...
- 【C库函数】strncpy函数详解
目录 strncpy 函数原型 参数讲解 返回值讲解 函数讲解 (1)一般使用场景 (2)特殊使用场景(错误) strncpy 拷贝n个字符到目标字符串中 函数原型 char *str ...
- 字符串拷贝函数:strcpy的详解及模拟实现
字符串拷贝函数:strcpy的详解及模拟实现!!! 对于字符串拷贝函数,之前在学习字符串时候,就已经学习过,但那只是片面的学习了一下,并没有经过系统的分析!只是大概的学习了一下!在关键的地方有时候还不 ...
- C语言strcpy、strcnpy函数详解
C语言strcpy.strcnpy函数详解 一.strcpy函数 1.函数原型 2.参数.返回值解析 3.注意事项 4.strcpy函数模拟实现 二.strncpy函数 1.函数原型 2.与strcp ...
- 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr strtok(及其模拟实现)
系列文章目录 字符函数和字符串函数详解(一)strlen strcpy strcat strcmp 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr str ...
- Memset 函数详解
Memset函数详解 需要的头文件 在C中<string.h> 在C++中<cstring> 函数介绍 memset 原型:extern void *memset(void * ...
- C语言网络编程:accept函数详解
文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...
- 【FFmpeg】函数详解(三)
FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...
- 【FFmpeg】函数详解(二)
FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...
最新文章
- 一个利用Dataflow实现的Actor
- 忽略某些文件 —— Git 学习笔记 05
- c++实现读写共享锁
- java简单文本编译器_java -简易文本编辑器
- 如何从基础到深入了解java构造器
- 关于C#语言中的集合
- 利用子查询解决复杂sql问题
- python开发app1001无标题_Python代写:CSSE1001 Dots Co帮做Python编程作业
- 车控APP发现安全隐患,研究人员模拟黑客入侵
- PIR控制器调节器并网逆变器电流谐波抑制策略
- 网上提交材料时让登记照瞬间符合审核尺寸要求的小工具
- 虹科工业树莓派在激光雕刻中的应用
- 详解 Redis 中布隆过滤器解决缓存穿透问题
- 程序员会不会英语的差别
- Mysql中LENGTH()函数
- bzoj1236 KPSUM bzoj2900 好玩的数字游戏
- 58同成前端面试分析
- 博客中可用的Emoji表情符号集,拿走不谢❤️❣️
- node-sassnpm ERR! command failed
- 计算机辅助制造工程师什么,cam工程师是什么意思