这是两道经常考到的笔试题,看似简单的实现,其实专注到细节,还是有很多需要注意扣分的地方。

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;
}

最新文章

  1. Docker中部署Kubernetes
  2. shr 右移测试
  3. 【Arduino】旋转编码器的Arduino使用方法
  4. [Codeforces] 347B - Fixed Points
  5. 怎样用Excel自动排成绩
  6. Lua中的require(转)
  7. 为什么重写 equals 方法 必须重写 hashCode
  8. 如何让用户登录Dynamics 365 Customer Engagement后自动登录到Unified Interface App?
  9. Web版记账本开发记录(三)开发过程遇到的问题小结2
  10. 你不知道的JavaScript-2.词法作用域
  11. python day18--面向对象,继承
  12. ==和equal()的区别
  13. linux内核中的DMI是什么?
  14. tensorflow example1
  15. Python自学笔记-装饰器1(廖雪峰的网站)
  16. protected
  17. Python开发接水果小游戏
  18. LINQ操作List&lt;T&gt;
  19. Rigidbody-ClosestPointOnBounds测试
  20. 并发编程 - 协程 - 1.协程概念/2.greenlet模块/3.gevent模块/4.gevent实现并发的套接字通信

热门文章

  1. LTE
  2. MqttNet 通讯
  3. C语言字符串的操作
  4. win 10安装应用程序提示Error 1317的解决方法
  5. input 标签只能输入数字
  6. nginx基础学习第二篇:nginx内置变量的使用
  7. 【转】常用算法复习及实现(C++版)
  8. TortoiseGit学习系列之Git和TortoiseGit的区别
  9. linux 查看端口,开启新端口
  10. jQuery中遇到的坑