Chinaunix首页 | 论坛 | 博客
  • 博客访问: 778889
  • 博文数量: 230
  • 博客积分: 6330
  • 博客等级: 准将
  • 技术积分: 2188
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-10 15:55
个人简介

脚踏实地

文章分类

全部博文(230)

文章存档

2017年(1)

2016年(7)

2015年(10)

2014年(32)

2013年(24)

2012年(33)

2011年(50)

2010年(30)

2009年(43)

分类: C/C++

2009-11-22 22:30:31

1  ---itoa  和 atoi----
itoa的Linux实现:
void itoa( int i,char* string)
    {
        int power, j;
        j=i;
        for (power=1;j>=10;j/=10)  //找到最高位不可避免的先遍历一遍哈
            power*=10;
        for (;power>0;power/=10)
        {
            *string++='0'+i/power; i%=power;
        }
        *string='\0';          //不要忘记哈
    }
 
      ------------
#include
#include
int atoi(const char* str)
{
    int result = 0;
    int sign = 0;
    assert(str != NULL);
    // proc whitespace characters
    while (*str==' ' || *str=='\t' || *str=='\n')
        ++str;
    // proc sign character
    if (*str=='-')
    {
        sign = 1;
        ++str;
    }
    else if (*str=='+')
    {
        ++str;
    }
    // proc numbers
    while (*str>='0' && *str<='9')
    {
        result = result*10 + *str - '0'; //这个就不必
                                      //再遍历了哈
        ++str;
    }
    // return result
    if (sign)
        result *= -1;
    return result;
}
 
//  对于此函数中负数为-2147483648的情况,尽管是符号和数值分开处理,但是二进制补码编码都为1000 0000 0000 0000 0000 0000 0000 0000,这样result再乘以-1(二进制补码编码为1111 1111 1111 1111 1111 1111 1111 1111),截断后result的结果依然为1000 0000 0000 0000 0000 0000 0000 0000

2. 常用的memcpy会有内存区域重叠覆盖的问题。

  1. void * __cdecl memcpy (
  2.         void * dst,
  3.         const void * src,
  4.         size_t count
  5.         )
  6. {
  7.         void * ret = dst;
  8.         /* 最好assert一下 src和 dst不为空。 */
  9.         if (count >0) {
  10.         while (count--) {
  11.                 *(char *)dst = *(char *)src;
  12.                 dst = (char *)dst + 1;
  13.                 src = (char *)src + 1;
  14.         }
  15.         }
  16.         return(ret);
  17. }

  18. void *MyMemCopy(void *dest,const void *src,size_t count)
  19. {
  20.     char *pDest=static_cast<char *>(dest);
  21.     const char *pSrc=static_cast<const char *>(src);

  22.     //注意,这里是关键,为什么要这样比较呢?理由何在?
  23.     if( pDest>pSrc && pDest<pSrc+count )
  24.     {
  25.         for(size_t i=count-1; i<=0; ++i)
  26.         {
  27.             pDest[i]=pSrc[i];
  28.         }
  29.     }
  30.     else
  31.     {
  32.         for(size_t i=0; i<count; ++i)
  33.         {
  34.              pDest[i]=pSrc[i];
  35.         }
  36.     }

  37.     return pDest;
  38. }

阅读(570) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~