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中获取生产库的元数据信息.
随机推荐
- LOJ6500. 「雅礼集训 2018 Day2」操作(哈希+差分)
题目链接 https://loj.ac/problem/6500 题解 区间取反 \(01\) 串的经典套路是差分.我们令 \(b_i = a_i\ {\rm xor}\ a_{i - 1}\)(\( ...
- C#集合之位数组
如果需要处理的数字有许多位,就可以使用BitArray类和BitVector32结构.BitArray类位于System.Collection,BitVector32结构位于System.Collec ...
- vue-lazyload图片懒加载的简单使用
一.vue lazyload插件: 插件地址:https://github.com/hilongjw/vue-lazyload demo:http://hilongjw.github.io/vue-l ...
- centos 7 下安装nginx-1.15.7
安装所需环境 Nginx 是 C语言 开发,建议在 Linux 上运行,当然,也可以安装 Windows 版本,本篇则使用 CentOS 7 作为安装环境. 一. gcc 安装安装 nginx 需要先 ...
- es put mapping
fd dg public Map<String, Map<String, String>> javaBeanToMapping(Object instance, List< ...
- unittest实现批量处理测试集
批量执行测试集 #coding=utf-8 from selenium import webdriver from selenium.webdriver.common.by import By fro ...
- httpclient文件下载
http://blog.csdn.net/nupt123456789/article/details/42721003
- FLUSH TABLES WITH READ LOCK 和 LOCK TABLES 之种种
1.FLUSH TABLES WITH READ LOCK 这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读.一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行. ...
- Java的IO流各个类的使用原则
参考:http://blog.csdn.net/ilibaba/article/details/3955799 Java IO 的一般使用原则(花多眼乱,其实每个类都有专门的作用): 这里有详细介绍: ...
- Cocos2dx v3.9项目位置和基本操作
MainScene.lua 在Mydemo\src\app\views下 官方示例 cocos2d-win32.sln在cocos2d-x-3.9\build下 生成项目 -l指定语言,-d指定路径 ...