8. 字元串轉換整數 (atoi)
請你來實作一個 atoi 函數,使其能将字元串轉換成整數。
首先,該函數會根據需要丢棄無用的開頭空格字元,直到尋找到第一個非空格的字元為止。接下來的轉化規則如下:
如果第一個非空字元為正或者負号時,則将該符号與之後面盡可能多的連續數字字元組合起來,形成一個有符号整數。
假如第一個非空字元是數字,則直接将其與之後連續的數字字元組合起來,形成一個整數。
該字元串在有效的整數部分之後也可能會存在多餘的字元,那麼這些字元可以被忽略,它們對函數不應該造成影響。
注意:假如該字元串中的第一個非空格字元不是一個有效整數字元、字元串為空或字元串僅包含空白字元時,則你的函數不需要進行轉換,即無法進行有效轉換。
在任何情況下,若函數不能進行有效的轉換時,請傳回 0 。
提示:
本題中的空白字元隻包括空格字元 ' ' 。
假設我們的環境隻能存儲 32 位大小的有符号整數,那麼其數值範圍為 [−231, 231 − 1]。如果數值超過這個範圍,請傳回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
思路:
其實思路很簡單,主要主要邊界條件
if(sum > 214748364 || (sum == 214748364 && str[i] >= '8'))
return -2147483648;
if條件中的str[i] >= '8'等号的條件必須在此時傳回,不然在下邊sum計算和的地方會越界。
sum = sum * 10 + str[i] - '0';
看到了越界,-_-||,從左到右的計算原則,sum = 214748364, 會先計算sum * 10 + str[i],造成越界
可以改為 sum = sum * 10 + (str[i] - '0'); 或者 sum = sum * 10 - '0' + str[i] ;
代碼:
int myAtoi(char * str){
int i = 0;
int flag = 1;
int sum = 0;
if(str == NULL)
return 0;
while(str[i] == ' ' && str[i] != '\0')
i++;
if(str[i] < '0' || str[i] > '9')
if(str[i] == '-')
{
flag = -1;
i++;
}
else if(str[i] == '+')
i++;
else
return 0;
while(str[i] >= '0' && str[i] <= '9')
{
if(flag == 1)
{
if(sum > 214748364 || (sum == 214748364 && str[i] >= '7'))
return 2147483647;
}
else
{
if(sum > 214748364 || (sum == 214748364 && str[i] >= '8'))//='8'需要在此處傳回,不然在下邊sum計算會越界。
return -2147483648;
}
//sum = sum * 10 + str[i] - '0';//竟然越界,-_-||,從左到右的計算原則,加括号就好
//也可以寫成sum = sum * 10 - '0' + str[i];
sum = sum * 10 + (str[i] - '0');
i++;
}
sum = sum * flag;
return sum;
}