一:实现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. markdown的基本使用

    1.什么是markdown? markdown是一种轻量级的标记语言 可以转换为html/xhtml和其它格式 可读.直观.学习成本低 当你学会使用markdown编写文档时,你会感觉自己发现了一个新 ...

  2. 每天一个linux命令:ps命令

      Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进 ...

  3. 第九章 nginx基础之搭建小游戏

    一.nginx部署 1.epel源安装 [root@web01 ~]# yum install -y nginx 2.官方源安装 1.配置官方源[root@web02 ~]# vim /etc/yum ...

  4. codeforces#426(div1) B - The Bakery (线段树 + dp)

    B. The Bakery   Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought req ...

  5. MongoDB添加认证

    创建用户管理员 在admin数据库中,添加具有该userAdminAnyDatabase角色的用户 .根据需要为此用户添加其他角色. 注意:创建用户的数据库(在此示例中为 admin)是用户的身份验证 ...

  6. Python ( 学习 基础篇第一部 )

    目录 注释 注释的分类 注释的注意点 变量 变量的概念 变量的声明 变量的命名 变量的交换 变量的缓存机制 常量 进制 进制的转换 原码 反码 补码 六大数据类型 Number 的四大类 字符串 st ...

  7. Lombda表达式(四)

    /* * 自定义函数式接口: * 1.声明一个接口,只能包含一个抽象方法 * 2.给这个接口加@FunctionalInterface */ public class Test { public st ...

  8. Mac下使用GitHub+Hexo搭建个人博客

    首发链接 开始之前需要在电脑上安装好Git和node.js,Mac上可以使用Homebrew命令行工具来安装Git和node.js 安装Homebrew 在命令行工具输入以下命令,如果已经安装过Hom ...

  9. CNN作为denoiser的优势总结

    图像恢复的MAP推理公式: $\hat{x}\text{}=\text{}$arg min$_{x}\frac{1}{2}||\textbf{y}\text{}-\text{}\textbf{H}x| ...

  10. 【Golang】vscode 设置 go 开发环境

    步骤 1. 始 Golang 语言开发选择一款合适的编辑器,能加速你敲字的灵感,这里推荐微软的 Visual Studio Code,简称 vscode. 2. 安装 go 插件 首先需要安装 go ...