今天看見大家在討論atoi這個(gè)函數(shù),我也湊個(gè)熱鬧,學(xué)習(xí)下atoi函數(shù)的用法,記得當(dāng)時(shí)學(xué)C語言,以為就只能將全是數(shù)字的字符串轉(zhuǎn)化成整數(shù),現(xiàn)在明白了遠(yuǎn)不至如此。
1、能夠?qū)漠?dāng)前開始的字符(數(shù)字或+、-)到第一個(gè)不是數(shù)字的字符結(jié)束的數(shù)字字符串,轉(zhuǎn)化成整數(shù);
這個(gè)也就是有人在blog中談?wù)摰那熬Y匹配。
2、需要注意的指針在這個(gè)過程中的指向發(fā)生了改變
下面給出我的atoi實(shí)現(xiàn)代碼
int aatoii(const char * str)
{
if(str == NULL) return 0;
int result = 0;
int sign = 1;
if( ('0'<= str[0] && str[0] <= '9') ||(str[0]=='-') || str[0]=='+')
{
if(str[0] == '+' || str[0] == '-')
{
if(str[0]=='-')
{
sign = -1;
}
str++;
}
}
else
{
return 0;
}
while('0'<= *str && *str <= '9')
{
result = result*10 + (*str++ - '0');
}
return result;
}
修改版:
int aatoii(const char * str)
{
if(str == NULL) return 0;
int result = 0;
int sign = 1;
if( ('0'<= str[0] && str[0] <= '9') ||(str[0]=='-') || str[0]=='+')
{
if(str[0] == '+' || str[0] == '-')
{
if(str[0]=='-')
{
sign = -1;
}
str++;
}
}
while('0'<= *str && *str <= '9' )
{
result = result*10 + (*str++ - '0');
}
return result * sign;
}
后面說我沒溢出判斷:
我仔細(xì)想了想:我認(rèn)為沒必有,由于我保證了傳進(jìn)來的str是有意義的:
無外乎這幾種情況: {'\0'}, {'+', '\0'}, {'1', '2', '\0'} , {'a', 'b', '1', '2', '\0'},這些都應(yīng)該沒有問題
,由于while('0' <= *str && *str <= '9'),等于間接就判斷了。
修改版二:
現(xiàn)在發(fā)現(xiàn)我對(duì)溢出的理解是錯(cuò)誤,下面給出代碼
ps:發(fā)現(xiàn)linux的顏色真好看,
3、今天我才明白const char* str; 是修飾字符串不能改變的,而不是指針, 修飾常量指針的是char* const str;
那我就說說吧:
const int * const pint; //一個(gè)const指針,指向一個(gè)const成員
const int * pint; //一個(gè)非const指針, 指向一個(gè)const成員
int *pint; //一個(gè)非const指針,指向一個(gè)非const成員
int * const pint; //一個(gè)const指針,指向一個(gè)非const成員
int const * pint; //和第二個(gè)一樣, 一個(gè)非const指針, 指向一個(gè)const成員, 這個(gè)不常用
posted on 2011-03-13 13:08
Cunch 閱讀(17928)
評(píng)論(10) 編輯 收藏 引用 所屬分類:
C++