一、 題目
題目目的很明顯,就是將一個字符串轉換成整數,也就是平時經常用到的atoi.
二、 分析
題目其實不難,不過需要注意下面幾點:
1、字符串前的空白
2. 字符串所表示數值的正負號
3. 結束條件,遇到非數字或者字符'\0'結束
4. 考慮溢出,與int值所能表示的最大(0x7fffffff)和最小值進行比較
5. 考慮異常輸入情況下,用全局變量valid來標識,對於"+/-" "0" "+abc"需要進行區分
6、還有就是測試過程中發現的對於“+-2”的處理是返回0;對於超出范圍的數,如果是正數則將其置為(0x7fffffff), 如果為負數則將其置為(- 0x7fffffff – 1)。我在這兩個地方都出錯了….所以,在我們考慮到這些情況後,我們不難寫出程序。如下:
class Solution {
public:
int atoi(const char *str) {
//正負數標識
bool flag = false;
//作為負數是否小於0x80000000的標識
int tmin = 0;
long long sum = 0;
//判斷字符串是否為空
if(str == NULL)
return 0;
//去除前置空格
while(*str == ' ')
str++;
//判斷數的符號,當時以為可以有多個符號取最後一個呢,後來發現只允許一個符號位
if(*str == '-'){
flag = true;
str++;
}
else if(*str == '+'){
str++;
}
//判斷數的合法性
if(*str < '0'|| *str >'9')
return 0;
//處理有效字符的值
while(*str>='0'&&*str<='9'){
sum = sum * 10 + *str -'0' ;
//判斷是否超過了規定的范圍
if( !flag && sum > (int)0x7FFFFFFF){
sum = (int)0x7FFFFFFF;
break;
}else if( flag && sum > (int)0x7FFFFFFF){
sum = (int)0x7FFFFFFF;
tmin = 1;
break;
}
str++;
}
//判斷數的符號
if(flag&&tmin)
sum = -sum-1;
else if(flag&&!tmin)
sum = -sum;
return sum;
}
};