題目:輸入乙個表示整數的字串,把該字串轉換成整數並輸出。
例如輸入字串
"345"
,則輸出整數
345。
分析:這道題儘管不是很難,學過
c/c++
語言一般都能實現基本功能,但不同程式設計師就這道題寫出的**有很大區別,可以說這道題能夠很好地反應出程式設計師的思維和程式設計習慣,因此已經被包括微軟在內的多家公司用作面試題。建議讀者在往下看之前自己先編寫**,再比較自己寫的**和下面的參考**有哪些不同。
首先我們分析如何完成基本功能,即如何把表示整數的字串正確地轉換成整數。還是以"
345"
作為例子。當我們掃瞄到字串的第乙個字元'
3'時,我們不知道後面還有多少位,僅僅知道這是第一位,因此此時得到的數字是
3。當掃瞄到第二個數字'
4'時,此時我們已經知道前面已經乙個
3了,再在後面加上乙個數字
4,那前面的
3相當於
30,因此得到的數字是
3*10+4=34
。接著我們又掃瞄到字元'
5',我們已經知道了'
5'的前面已經有了
34,由於後面要加上乙個
5,前面的
34就相當於
340了,因此得到的數字就是
34*10+5=345
。分析到這裡,我們不能得出乙個轉換的思路:每掃瞄到乙個字元,我們把在之前得到的數字乘以
10再加上當前字元表示的數字。這個思路用迴圈不難實現。
由於整數可能不僅僅之含有數字,還有可能以'
+'或者'
-'開頭,表示整數的正負。因此我們需要把這個字串的第乙個字元做特殊處理。如果第乙個字元是'
+'號,則不需要做任何操作;如果第乙個字元是'
-'號,則表明這個整數是個負數,在最後的時候我們要把得到的數值變成負數。
接著我們試著處理非法輸入。由於輸入的是指標,在使用指標之前,我們要做的第一件是判斷這個指標是不是為空。如果試著去訪問空指標,將不可避免地導致程式崩潰。另外,輸入的字串中可能含有不是數字的字元。每當碰到這些非法的字元,我們就沒有必要再繼續轉換。最後乙個需要考慮的問題是溢位問題。由於輸入的數字是以字串的形式輸入,因此有可能輸入乙個很大的數字轉換之後會超過能夠表示的最大的整數而溢位。
現在已經分析的差不多了,開始考慮編寫**。首先我們考慮如何宣告這個函式。由於是把字串轉換成整數,很自然我們想到:
intstrtoint(const char* str);
這樣宣告看起來沒有問題。但當輸入的字串是乙個空指標或者含有非法的字元時,應該返回什麼值呢?
0怎麼樣?那怎麼區分非法輸入和字串本身就是
」0」這兩種情況呢?
接下來我們考慮另外一種思路。我們可以返回乙個布林值來指示輸入是否有效,而把轉換後的整數放到引數列表中以引用或者指標的形式傳入。於是我們就可以宣告如下:
bool
strtoint(const char *str, int& num);
這種思路解決了前面的問題。但是這個函式的使用者使用這個函式的時候會覺得不是很方便,因為他不能直接把得到的整數賦值給其他整形變臉,顯得不夠直觀。
前面的第一種宣告就很直觀。如何在保證直觀的前提下當碰到非法輸入的時候通知使用者呢?一種解決方案就是定義乙個全域性變數,每當碰到非法輸入的時候,就標記該全域性變數。使用者在呼叫這個函式之後,就可以檢驗該全域性變數來判斷轉換是不是成功。
下面我們寫出完整的實現**。參考**:
enum
status ;
intg_nstatus = kvalid;
///// convert a string into an integer
///int
strtoint(const
char* str)
// the remaining chars in the string
while(*digit != '\0')
digit ++;
}// if the char is not a digit, invalid input
else
}if(*digit == '/0')
}return
static_cast
<
int>(num);}
討 論:在參考**中,我選用的是第一種宣告方式。不過在面試時,我們可以選用任意一種宣告方式進行實現。但當面試官問我們選擇的理由時,我們要對兩者的優缺 點進行評價。第一種宣告方式對使用者而言非常直觀,但使用了全域性變數,不夠優雅;而第二種思路是用返回值來表明輸入是否合法,在很多
api中都用這種方法,但該方法宣告的函式使用起來不夠直觀。
最後值得一提的是,在c
語言提供的庫函式中,函式
atoi
能夠把字串轉換整數。它的宣告是
intatoi(const
char*str)
。該函式就是用乙個全域性變數來標誌輸入是否合法的。
把字串轉換成整數
題目 輸入乙個表示整數的字串,把該字串轉換成整數並輸出。例如輸入字串 345 則輸出整數345 分析 這道題儘管不是很難,學過c c 語言一般都能實現基本功能,但不同程式設計師就這道題寫出的 有很大區別,可以說這道題能夠很好地反應出程式設計師的思維和程式設計習慣,因此已經被包括微軟在內的多家公司用作...
把字串轉換成整數
題目 輸入乙個表示整數的字串,把該字串轉換成整數並輸出。例如輸入字串 345 則輸出整數 345。分析 這道題儘管不是很難,學過c c 語言一般都能實現基本功能,但不同程式設計師就這道題寫出的 有很大區別,可以說這道題能夠很好地反應出程式設計師的思維和程式設計習慣,因此已經被包括微軟在內的多家公司用...
把字串轉換成整數
題目 輸入乙個表示整數的字串,把該字串轉換成整數並輸出。例如輸入字串 345 則輸出整數 345。分析 這道題儘管不是很難,學過c c 語言一般都能實現基本功能,但不同程式設計師就這道題寫出的 有很大區別,可以說這道題能夠很好地反應出程式設計師的思維和程式設計習慣,因此已經被包括微軟在內的多家公司用...