面試題1:把ASCII碼整數字符串轉換成對應的整數
題目:
輸入一個表示整數的字串,把該字串轉換成整數並輸出。
例如輸入字串"345",則輸出整數345。
分析:
首先我們分析如何完成基本功能,即如何把表示整數的字串正確地轉換成整數。還是以"345"作為例子。當我們掃描到字串的第一個字元'3'時,我們不知道後面還有多少位,僅僅知道這是第一位,因此此時得到的數字是3。當掃描到第二個字元'4'時,此時我們知道前面已經有一個3了,再在後面加上一個數字4,那前面的3相當於30,因此得到的數字是3*10+4=34。接著我們又掃描到字元'5',我們知道'5'的前面已經有了34,由於後面要加上一個5,前面的34就相當於340了,因此得到的數字就是34*10+5=345。分析到這裡,我們不難得出一個轉換的思路:每掃描到一個字元,我們把在之前得到的數字乘以10再加上當前字元表示的數字。這個思路用迴圈不難實現。
由於整數可能不僅僅只含有數字,還可能以'+'或'-'開頭,表示整數的正負。因此我們需要把字串的第一個字元做特殊處理。如果第一個字元是'+',則不需要做任何操作;如果第一個字元是'-',則表明這個整數是個負數,在最後的時候我們要把得到的數值變成負數。
接著我們處理非法輸入。由於輸入的是指標,在使用指標之前,我們要做的第一件事是判斷這個指標是否為空。如果試著去訪問空指標,將不可避免地導致程式崩潰。另外,輸入的字串中可能含有不是數字的非法字元。每當碰到這些非法的字元,我們就沒有必要再繼續轉換。最後一個需要考慮的是溢位問題。由於輸入的數字是以字串的形式輸入,因此有可能輸入一個很長的數字串轉換之後會超過能夠表示的最大整數而溢位。
編碼:
#include <stdio.h>
#include <limits.h>
#define SUCCESS 1
#define FAIL 0
int StrToInt(char * str);
int Status = SUCCESS;
int main(void)
{
char * string ="-92147483647";
int number;
number =StrToInt(string);
if (FAIL ==Status)
printf("轉換失敗,錯誤碼%d\n", number);
else
printf("%s轉換成整數%d\n", string, number);
return 0;
}
// 把一個ASCII碼整數字符串轉換成對應的整數
// 錯誤碼0、1、2分別表示空指標、無效字串、溢位
int StrToInt(char * str)
{
double num = 0;//儲存轉換後的整數
int sign = 0;//記錄整數的符號,0正1負
// 判斷是否為空指標
if (NULL == str)
{
Status =FAIL;
return 0;
}
// 判斷整數的符號
if ('+' == *str)
{
++str;
}
else if ('-' ==*str)
{
sign = 1;
++str;
}
// 判斷是否為僅有一個符號的字串 "+"或"-"
if ('\0' == *str)
{
Status =FAIL;
return 1;
}
// 轉換字串為對應的整數
while ('\0' !=*str)
{
if(*str>='0' && *str<='9')
{
num= 10*num+(*str-'0');
// 判斷是否會溢位
if( (!sign&&num>INT_MAX) || (sign&&-num<INT_MIN))
{
Status= FAIL;
return2;
}
}
else
{
Status= FAIL;
return1;
}
++str;
}
if (sign)
num =-num;
return (int)num;
}
測試:
輸入空指標:0或NULL
空字串:""
僅有一個符號的字串:"+"、"-"
以非('+' '-' 數字)開始的字串:"ab123"
正常輸入(可能有正負號):"12345"、"+12345"、"-12345"
正常輸入後面接非數字字元:"+123a"
最大的正整數和最小的負整數:"2147483647"、"-2147483648"
溢位:"62147483647"、"-92147483647"