牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

自己实现的atoi()函数

函数描述:
    将字符串str转换成一个整数并返回结果。参数str 以数字开头,当函数从str 中读到非数字字符则结束转换并将结果返回。

int atoi( const char *str )
{
    
if (str == 0 ) return 0;
    
    
int nRet = 0;
    
int nLen = 0;
    
bool bSign = true;
    
bool bFlag = false;
    
    nLen 
= strlen(str);
    
if (nLen == 0return 0;

    
for (int i=0; i<nLen; ++i)
    
{
        
if ( str[i] == ' ' && (!bFlag)) continue;
        
if ( str[i] >= '0' && str[i] <= '9'{ nRet = nRet * 10 + ( str[i] - '0'); bFlag = truecontinue;}
        
if ( str[i] == '+' && (!bFlag) ) { bFlag = bSign = truecontinue; }
        
if ( str[i] == '-' && (!bFlag) ) { bFlag = true; bSign = falsecontinue; }
        
break;
        
//if ( bFlag && ( str[i] == '+' || str[i] == '-' || str[i] == ' ')) break;
        
//if ( str[i] < '0' && str[i] > '9' && str[i] != '+' && str[i] != '-' && str[i] != ' ') break;
    }

    
if (!bSign) nRet = -nRet;
    
return nRet;
}


Edit:2008.09.18
今天和同事讨论这个方法,回过头来看这个方法,发现了这个函数的不足,因此今天重新写了一下,精简临时变量到两个.算法还是以前用到的穷举法.
仔细的去思考了下,减少了不少无用功和不必要的临时变量.
int ATOI( const char *str )
{
    
if (str == 0 ) return 0;
    
char c;
    
int nRet = -1;
    
for (;;)
    
{
        c 
= *(str++);
        
if ( c >= '0' && c <= '9')
        
{
            
if (nRet==0 || nRet==-1{nRet = c - '0';}// 正数第一个数字
            else if (nRet==-2{nRet = -( c - '0');}// 负数第一个数字
            else nRet = nRet * 10 + ( c - '0');// 其他数字
            continue;
        }

        
if ( ( (c > 0x08 && c < 0x0E|| c == 0x20&& (nRet==-1)) continue;// 剪掉空白字符
        if ( c == '+' && (nRet==-1) ) { nRet = 0continue; }// 正数符号
        if ( c == '-' && (nRet==-1) ) { nRet = -2continue; }// 负数符号
        if ( (nRet == -1|| (nRet == -2) ) nRet = 0;// 失败返回0值
        break;
    }

    
return nRet;
}

posted on 2007-07-20 17:16 杨粼波 阅读(3041) 评论(3)  编辑 收藏 引用

评论

# re: 自己实现的atoi()函数 2008-12-04 14:02 hdc

很好,收下学习~~  回复  更多评论   

# re: 自己实现的atoi()函数 2009-03-30 10:28 kimi

如果溢出呢?如何处理?  回复  更多评论   

# re: 自己实现的atoi()函数 2009-05-26 23:28 嘿嘿嘿嘿

建议看一下glibc里的源代码  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理