要善用百度。。。百度百科就有atoi這個(gè)詞條,里面有c語(yǔ)言實(shí)現(xiàn)的源代碼(其實(shí)是c++,不過(guò)唯一的不同只是它的字符串定義為了const,即常量,表示在函數(shù)里不允許改變此字符串內(nèi)容)
為龍華等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及龍華網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、龍華網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
我在這里加上注釋簡(jiǎn)單說(shuō)明一下該源碼
int
my_atoi(const
char
*str){
int
result;
//保存返回結(jié)果的
int
signal
=
1;
//保存符號(hào)的,默認(rèn)正數(shù)
//判斷第一個(gè)數(shù)字是否合法
if((*str='0'*str='9')||*str=='-'||*str=='+'){
//如果是-,符號(hào)變?yōu)?1,指針右移
//如果是+,指針右移(總之指向了第一個(gè)數(shù)字)
if(*str=='-'||*str=='+'){
if(*str=='-')
signal
=
-1;
str++;
}
}
else
return
0;//第一個(gè)不是+,-或數(shù)字,非法返回0
//這里就是轉(zhuǎn)換,是數(shù)學(xué)的問(wèn)題就不解釋了
while(*str='0'*str='9')
result
=
result*10+(*str++
-'0');
return
signal*result;
}
不過(guò)這個(gè)程序,如果字符串是非法的話,他也會(huì)返回直到非法字符之前的數(shù)值
比如123abc
返回值就是123
跟一行兩行沒(méi)關(guān)系, 跟了參數(shù),就會(huì)大于1了,第一個(gè)參數(shù)是程序本身,第二個(gè)參數(shù)開(kāi)始才是真正的參數(shù)
abcd轉(zhuǎn)換數(shù)值??你是要做16進(jìn)制的嗎?
一般atoi只是轉(zhuǎn)換10進(jìn)制的?不包括16進(jìn)制
如果你要支持16進(jìn)制?可以自行增加一個(gè)前導(dǎo)符?比較常用的是x
即如果字符串第一個(gè)字符為x?則表示改字符串為16進(jìn)制形式
判斷和你現(xiàn)有的符號(hào)判斷類(lèi)似,處理數(shù)據(jù)的時(shí)候不能用isdigit判斷?而是要加入a-f的判斷
計(jì)算的時(shí)候?10*n改成16*n
簡(jiǎn)單的例子
int?atoi(char?s[])
{
int?i,?n,?sign;
for?(i?=?0;?isspace(s[i]);?i++)??/*?skip?white?space?*/
;
if(s[i]?==?'x')/*hex*/
{
i?++;
for?(n?=?0;?isdigit(s[i])?||?(s[i]='a'??s[i]?=?'f');?i++)
{
if(isdigit(s[i]))
n?=?16?*?n?+?(s[i]?-?'0');
else
n?=?16?*?n?+?(s[i]?-?'a')+10;?
}
return?n;
}
sign?=?(s[i]?==?'-')???-1?:?1;
if?(s[i]?==?'+'?||?s[i]?==?'-')??/*?skip?sign?*/
i++;
for?(n?=?0;?isdigit(s[i]);?i++)
n?=?10?*?n?+?(s[i]?-?'0');
return?sign?*?n;
}