一:实现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 }

手写atoi、strcpy、strcat的更多相关文章

  1. opencv 手写选择题阅卷 (三)训练分类器

    opencv 手写选择题阅卷 (三)训练分类器 1,分类器选择:SVM 本来一开始用的KNN分类器,但这个分类器目前没有实现保存训练数据的功能,所以选择了SVN分类器; 2,样本图像的预处理和特征提取 ...

  2. c++后台开发面试常见知识点总结(六)算法手写

    链表倒转  leetcode-206 连续子数组最大和问题(和最大的连续子序列的和)   leetcode-53 输出字符串中最长的回文子串长度?  leetcode-5 一个字符串,求最长无重复子串 ...

  3. 基于opencv的手写数字识别(MFC,HOG,SVM)

    参考了秋风细雨的文章:http://blog.csdn.net/candyforever/article/details/8564746 花了点时间编写出了程序,先看看效果吧. 识别效果大概都能正确. ...

  4. 字符串操作函数<string.h>相关函数strcpy,strcat,等源码。

    首先说一下源码到底在哪里找. 我们在文件中包含<cstring>时,如果点击右键打开文档, 会打开cstring,我们会发现路径为: D:\Program Files\visual stu ...

  5. 简单HOG+SVM mnist手写数字分类

    使用工具 :VS2013 + OpenCV 3.1 数据集:minst 训练数据:60000张 测试数据:10000张 输出模型:HOG_SVM_DATA.xml 数据准备 train-images- ...

  6. matlab手写神经网络实现识别手写数字

    实验说明 一直想自己写一个神经网络来实现手写数字的识别,而不是套用别人的框架.恰巧前几天,有幸从同学那拿到5000张已经贴好标签的手写数字图片,于是我就尝试用matlab写一个网络. 实验数据:500 ...

  7. 【Win 10 应用开发】手写识别

    记得前面(忘了是哪天写的,反正是前些天,请用力点击这里观看)老周讲了一个14393新增的控件,可以很轻松地结合InkCanvas来完成涂鸦.其实,InkCanvas除了涂鸦外,另一个大用途是墨迹识别, ...

  8. JS / Egret 单笔手写识别、手势识别

    UnistrokeRecognizer 单笔手写识别.手势识别 UnistrokeRecognizer : https://github.com/RichLiu1023/UnistrokeRecogn ...

  9. 如何用卷积神经网络CNN识别手写数字集?

    前几天用CNN识别手写数字集,后来看到kaggle上有一个比赛是识别手写数字集的,已经进行了一年多了,目前有1179个有效提交,最高的是100%,我做了一下,用keras做的,一开始用最简单的MLP, ...

随机推荐

  1. docker自定义网络里的dns实现原理

    简单说一下流程吧,不写了. docker会修改容器里的/etc/resolv.conf文件,把dns服务器设置成127.0.0.11,因为127.0.0.0/8地址都是本机回环地址,所以dns查询的时 ...

  2. oracle 查询当前数据库环境

    select SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE')用户的认证类型 from dual;--用户的认证类型select SYS_CONTEXT('US ...

  3. RESP协议

    RESP 是 Redis 序列化协议的简写.它是⼀种直观的⽂本协议,优势在于实现异常简单,解析性能极好. Redis 协议将传输的结构数据分为 5 种最⼩单元类型,单元结束时统⼀加上回⻋换⾏符号\r\ ...

  4. .net 添加打印 源代码

    <div style="margin-top: auto; text-align: center;" id="buttondiv"> <obj ...

  5. 2020年Java基础超高频面试题汇总(1.2W字详细解析)

    1. Java语言有哪些特点 (1)简单易学.有丰富的类库 (2)面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高) (3)与平台无关性(JVM是Java跨平台使用的根本) (4)可靠安全 ...

  6. 脑桥Brain-Pons

    date: 2014-02-01 15:30:11 updated: 2014-02-01 15:30:11 [一] "2025.7.3.Brain-Pons?Expeiment?Under ...

  7. layui 的基本使用介绍

    全局配置 layui.config({ dir: '/res/layui/' //layui.js 所在路径(注意,如果是script单独引入layui.js,无需设定该参数.),一般情况下可以无视 ...

  8. spring与缓存注解,以及encache缓存使用

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

  9. Kubernetes 搭建 ES 集群(存储使用 local pv)

    一.集群规划 由于当前环境中没有分布式存储,所以只能使用本地 PV 的方式来实现数据持久化. ES 集群的 master 节点至少需要三个,防止脑裂. 由于 master 在配置过程中需要保证主机名固 ...

  10. templatedcodegenerator 简单模板化代码生成器

    传送门:https://github.com/uniqss/templatedcodegenerator templatedcodegenerator code generator with spec ...