自己實現的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 == 0) return 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 = true; continue;}
if ( str[i] == '+' && (!bFlag) )
{ bFlag = bSign = true; continue; }
if ( str[i] == '-' && (!bFlag) )
{ bFlag = true; bSign = false; continue; }
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 = 0; continue; }// 正數符號
if ( c == '-' && (nRet==-1) )
{ nRet = -2; continue; }// 負數符號
if ( (nRet == -1) || (nRet == -2) ) nRet = 0;// 失敗返回0值
break;
}
return nRet;
}
