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会有内存区域重叠覆盖的问题。
- void * __cdecl memcpy (
-
void * dst,
-
const void * src,
-
size_t count
-
)
-
{
-
void * ret = dst;
- /* 最好assert一下 src和 dst不为空。 */
-
if (count >0) {
-
while (count--) {
-
*(char *)dst = *(char *)src;
-
dst = (char *)dst + 1;
-
src = (char *)src + 1;
-
}
- }
-
return(ret);
-
}
-
-
void *MyMemCopy(void *dest,const void *src,size_t count)
-
{
-
char *pDest=static_cast<char *>(dest);
-
const char *pSrc=static_cast<const char *>(src);
-
-
//注意,这里是关键,为什么要这样比较呢?理由何在?
-
if( pDest>pSrc && pDest<pSrc+count )
-
{
-
for(size_t i=count-1; i<=0; ++i)
-
{
-
pDest[i]=pSrc[i];
-
}
-
}
-
else
-
{
-
for(size_t i=0; i<count; ++i)
-
{
-
pDest[i]=pSrc[i];
-
}
-
}
-
-
return pDest;
-
}
阅读(579) | 评论(0) | 转发(0) |