C中atoi和strcpy的自定义实现
这是两道经常考到的笔试题,看似简单的实现,其实专注到细节,还是有很多需要注意扣分的地方。
atoi实现:
#include <iostream>
#include<ctype.h>
using namespace std; typedef enum status{
OK,ERROR
}Status; Status myErrno = ERROR;
int my_atoi(const char *p);
int main()
{
char *mystr = "";
int ret = my_atoi(mystr);
cout << ret << endl;
return ;
} //实现atoi函数,将字符串转换为数字
int my_atoi(const char *p){
myErrno = ERROR;
if(NULL == p)
return ; int ret = ; const char *temp = p; //判断如果是前几位为空格,则向前移动字符串位置
while(isspace(*temp))
temp++; //判断符号位,是否为负数
bool minus = *temp=='-' ? true : false; //有符号位
if('+' == *temp || '-' == *temp)
++temp; while(*temp != '\0'){
if(isdigit(*temp)){ //是数字情况下
if((!minus && ret > 0x7FFFFFFF) || (minus && -minus < 0x80000000)){
//若当前数值范围超出int所能表达的范围
myErrno = ERROR;
return ;
} ret = ret* + (*temp++ - '');
}else{
//某位不是数字
myErrno = ERROR;
return ;
} } if(*temp == '\0'){
myErrno = OK;
} return minus ? -ret : ret;
}
strcpy的实现:
//实现trcpy函数
char *my_strcpy(char *dest,const char *src){
assert(dest != NULL && src != NULL); char *ret = dest;
while((*dest++ = *src++) != '\0'); return ret;
}
对于strcpy的实现,还是会有问题的,需要考虑到内存重叠的情况,比如:
char *str = 'abcde';
strcpy(str,str+1); //结果为bcde
strcpy(str+1,str); //期望结果:aabcde,但运行会报错,因为str内存有重叠,会把'\0'覆盖掉
但是如果调用系统中的strcpy是不会有这个问题,其实要解决这个问题需要配合memcpy来使用
char *my_strcpy(char *dest,const char *src){
assert(dest != NULL && src != NULL);
char *ret = dest;
memcpy(dst,src,strlen(src)+);
return ret;
}
至于memcpy的实现,建议参考 http://blog.csdn.net/gpengtao 这为大牛的实现:
void * my_memcpy(void *dst,const void *src,unsigned int count)
{
assert(dst);
assert(src);
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重叠,低字节向高字节拷贝
{
while(count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + ;
src = (char *)src + ;
}
}
else //源地址和目的地址重叠,高字节向低字节拷贝
{
dst = (char *)dst + count - ;
src = (char *)src + count - ;
while(count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst - ;
src = (char *)src - ;
}
}
return ret;
}
C中atoi和strcpy的自定义实现的更多相关文章
- 转载 C++常用库函数atoi,itoa,strcpy,strcmp的实现
C++常用库函数atoi,itoa,strcpy,strcmp的实现 C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. ...
- FastReport调用Delphi中的人民币大写转换自定义函数
FastReport调用Delphi中的人民币大写转换自定义函数 FastReport调用Delphi中的人民币大写转换自定义函数 function TJzpzEdit1.MoneyCn(mmje ...
- Sqlserver中存储过程,触发器,自定义函数(二)
Sqlserver中存储过程,触发器,自定义函数: 自定义函数:1.函数类型:2.函数的参数和返回值: 1.函数类型:标量值函数,返回的是一个标量值表值函数:内联表值函数:多语句表值函数. 标量值函数 ...
- Sqlserver中存储过程,触发器,自定义函数(一)
Sqlserver中存储过程,触发器,自定义函数 1.存储过程有关内容存储过程的定义:存储过程的分类:存储过程的创建,修改,执行:存储过程中参数的传递,返回与接收:存储过程的返回值:存储过程使用游标. ...
- Sqlserver中存储过程,触发器,自定义函数
Sqlserver中存储过程,触发器,自定义函数: 1. 触发器:是针对数据库表或数据库的特殊存储过程,在某些行为发生的时候就会被激活 触发器的分类: DML触发器:发生在数据操作语言执行时触发执行的 ...
- Linq to Sql:N层应用中的查询(上) : 返回自定义实体
原文:Linq to Sql:N层应用中的查询(上) : 返回自定义实体 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候,我们使 ...
- HashSet存储过程中如何排除不同的自定义对象?
HashSet HashSet存储过程中如何排除不同的自定义对象? 先看一个小demo public class Demo1 { public static void main(String[] ar ...
- 在Asp.Net的Global.asax中Application_Error跳转到自定义错误页无效的解决办法
在开发Asp.Net系统的时候,我们很多时候希望系统发生错误后能够跳转到一个自定义的错误页面,于是我们经常会在Global.asax中的Application_Error方法中使用Response.R ...
- ODI中通过配置表和自定义逆向工程获取数据库信息
自定义逆向工程RKM 从配置表meta_db, meta_table, meta_column, meta_key中获取生产库的元数据信息.
随机推荐
- Golang开发环境搭建
1.下载golang安装包: 下载地址:https://golang.google.cn/dl/ 2.安装Eclipse 下载goclipse 插件 3.配置 Go 的编译器 4.写代码. packa ...
- git 换行符替换
https://help.github.com/en/articles/dealing-with-line-endings rm .git/index git reset https://github ...
- 利用URL Scheme打开APP并传递数据
https://blog.csdn.net/u013517637/article/details/55251421 利用外部链接打开APP并传递一些附带信息是现在很多APP都有的功能,我在这把这部分的 ...
- Mac下配置maven和集成到ecclipse(Mac 10.12)
1.到官网下载maven,http://maven.apache.org/download.cgi 下载好的tar.gz包解压出来,并重命名为maven3,拷贝到/usr/local目录下 2.配置环 ...
- 我的Python升级打怪之路【五】:Python模块
模块,是一些代码实现了某个功能的集合 模块的分类: 自定义模块 第三方模块 内置模块 导入模块 import module from module.xx.xx import xx from modul ...
- Java动态代理的理解
代码内容: https://github.com/cjy513203427/Java_Advanced_Knowledge/tree/master/src/com/advance/dynamic_pr ...
- 项目管理系列--从零开始Code Review[转]
从零开始Code Review 这篇帖子不是通篇介绍Code Review的方法论, 而是前大段记录了我们团队怎么从没有这个习惯到每天都进行review的过程, 后小段给出了我的一些建议. 希望能对诸 ...
- location.false(true)
location.reload()意思是从服务器端重新载入页面 ; location.false(true)意思是从缓存中重新载入.
- log4net.xml
<?xml version="1.0" encoding="UTF-8"?> <log4net> <root> <le ...
- Silverlight & Blend动画设计系列六:动画技巧(Animation Techniques)之对象与路径转化、波感特效
当我们在进行Silverlight & Blend进行动画设计的过程中,可能需要设计出很多效果不一的图形图像出来作为动画的基本组成元素.然而在设计过程中可能会出现许多的问题,比如当前绘制了一个 ...