一:实现atoi函数

 1 #include<iostream>
2
3 using namespace std;
4
5 int atoi_my(const char *str)
6 {
7 int s=0;
8 bool falg=false;
9
10 while(*str==' ')
11 {
12 str++;
13 }
14
15 if(*str=='-'||*str=='+')
16 {
17 if(*str=='-')
18 falg=true;
19 str++;
20 }
21
22 while(*str>='0'&&*str<='9')
23 {
24 s=s*10+*str-'0';
25 str++;
26 if(s<0)
27 {
28 s=2147483647;
29 break;
30 }
31 }
32 return s*(falg?-1:1);
33 }

二、实现strcpy函数:char *strcpy(char *dst, const char *src);

  如果不考虑内存重叠:

1 char*  strcpy(char* dst,const char* src)
2 {
3 assert(dst!=NULL&&src!=NULL);
4 char* res=dst;
5 while((*dst++=*src++)!='\0') ;
6 return res;
7 }

上面的实现没有考虑内存重叠,调用 char str[10]="abc";  my_strcpy(str+1,str);  会出错。然而调用系统的strcpy函数程序正常运行,打印str结果为“aabc”!可见系统strcpy函数的实现不是这样的。

strcpy的正确实现应为:

1 char *my_strcpy(char *dst,const char *src)
2 {
3 assert(dst != NULL);
4 assert(src != NULL);
5 char *ret = dst;
6 memcpy(dst,src,strlen(src)+1);
7 return ret;
8 }

memcpy函数实现时考虑到了内存重叠的情况,可以完成指定大小的内存拷贝,函数memcpy函数的实现:

 1 void * my_memcpy(void *dst,const void *src,unsigned int count)
2 {
3 assert(dst);
4 assert(src);
5 void * ret = dst;
6 if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重叠,低字节向高字节拷贝
7 {
8 while(count--)
9 {
10 *(char *)dst = *(char *)src;
11 dst = (char *)dst + 1;
12 src = (char *)src + 1;
13 }
14 }
15 else //源地址和目的地址重叠,高字节向低字节拷贝
16 {
17 dst = (char *)dst + count - 1;
18 src = (char *)src + count - 1;
19 while(count--)
20 {
21 *(char *)dst = *(char *)src;
22 dst = (char *)dst - 1;
23 src = (char *)src - 1;
24 }
25 }
26 return ret;
27 }

三、strcat函数的实现:

1 char *strcat(char *str1, const char *str2)
2 {
3 assert((str1!=NULL)&&(str2!=NULL)) ;
4 char *pt = str1;
5 while(*str1!='\0') str1++;
6 while(*str2!='\0') *str1++ = *str2++;
7 *str1 = '\0';
8 return pt;
9 }

最新文章

  1. 在 Linux 上使用 Jexus + Mono 建立 Asp.Net 网站.
  2. tyvj1468 清理垃圾
  3. paip.常用汉字形声字大全3500字
  4. JavaScript中Date的一些细节
  5. 汉字编码:GB2312, GBK, GB18030, Big5
  6. 多层感知机及其BP算法(Multi-Layer Perception)
  7. LT1619EMS8 锂电池 升压电路分析
  8. [Python]网络爬虫(一):抓取网页的含义和URL基本构成
  9. GF(2^8)乘法
  10. 1.4. chromium源代码分析 - chromiumframe - 消息系列
  11. linux小命令
  12. UVa 11879 - Multiple of 17
  13. 深入理解Java类加载器(1):Java类加载原理解析
  14. chainsql异常记录
  15. 安装docker ce版
  16. 修改linux系统编码
  17. Java接口获取系统配置信息
  18. 和求余运算巧妙结合的jns指令
  19. 全新Wijmo5中文学习指南正式上线
  20. POI 导出excel带小数点的数字格式显示不对解决方法

热门文章

  1. 多测师讲解接口测试 _HTTP常见的状态码归纳_高级讲师肖sir
  2. springboot2.2.2企业级项目整合redis与redis 工具类大全
  3. C和C++区别——前置自增与后置自增
  4. Flask实现websocket
  5. 单调队列+线性dp题Watching Fireworks is Fun (CF372C)
  6. linux(centos8):为prometheus安装grafana(grafana-7.0.3)
  7. centos8平台使用ab做压力测试
  8. socket php
  9. CentOS 6编译安装Redis
  10. mongodb安装及使用