微軟面試題之中的乙個,難度係數低。
題目描寫敘述例如以下:輸入乙個表示整數的字串,把該字串轉換成整數並輸出。
比如輸入字串"345"。則輸出整數345。
邏輯分析:
1、對於面試者來說,遇到這樣的題,算是非常幸運的,比起思維靈活度,本題更加注重基礎。也就是說,**的穩定性,健壯性一定要好。對c/c++比較熟悉的讀者應該非常快會想到乙個函式:atoi,沒錯。標準庫中的atoi就是將字串轉為整數的函式。儘管如此。但卻非常少有人嘗試去了解atoi這個函式的內部實現,竊以為,atoi的實現,事實上和str*系列函式同等重要。
2、說到穩定性,就要考慮幾個easy引起問題的地方。函式模型int atoi(char* str);,那麼第一點要考慮的。當然是str是否為空。另外,str中的字元僅僅可能存在三種情況:- | + | [0..9],假設存在其它字元,那麼則視為非法字元。最後一點,也是最easy忽略的,要考慮溢位問題。
給出**:
#include #include int atoi(char *str)
if(*p == '-')
else if(*p == '+')
while(*p != '\0')
}else
p++; } if(neg == false) num = -num; return num; } int main() ; for(int i=0; i<4;i++) return 0; }
輸出:
3、乍看起來。我們好像完畢了任務,可是實際上。當我寫完上述**之後,立馬反悔了。非常多讀者應該也察覺到了。上述**有乙個非常嚴重的漏洞,我們都知道由於補碼的形式儲存。負整數的絕對值上限是要比正整數上限大1的,而我們推斷的分支。顯然漏掉了負上限。再細緻考慮,就會發現,事實上判別**從一開始就錯了。並且是全然錯了。高階語言不是彙編。我們無法通過cf,of之類的(無符號當然是cf)標誌位來判別。而在我們的程式中。num是永遠不可能大於int_max的,由於當num超過了這個值。則會自己主動溢位。變為乙個非常小的值,再去比較顯然沒有意義。正確的處理。是要對照計算前後的num,假設計算後的值小於計算前,顯然發生了溢位(想想為什麼)。
第二種處理方式,就是從位數進行比較,顯然後者略麻煩一些,倒也不失為一種思路。
**不再糾正,興許工作由讀者完畢。
字串轉換成整數
題目詳情 輸入乙個表示整數的字串,把該字串轉換成整數並輸出,例如輸入字串 345 則輸出整數345。請完成函式strtoint,實現字串轉換成整數的功能。友情提醒 提交 之前,請複查下你的程式,比如當給的字串是如左邊所示的時候,有考慮到麼?當然,它們各自對應的正確輸出如右邊所示 假定你是在32位系統...
字串轉換成整數
輸入乙個表示整數的字串,把該字串轉換成整數並輸出,例如輸入字串 345 則輸出整數345。需要考慮的問題 1.由於整數可能不僅僅之含有數字,還有可能以 或者 開頭,表示整數的正負。2.處理非法輸入。在使用指標之前判斷這個指標是不是為空。3.輸入的字串中可能含有不是數字的字元。4.最後乙個需要考慮的問...
字串轉換成整數
字串轉換成整數。不廢話,貼 在網上找到了大神july的帖子,發現即使演算法非常細膩,但是我自己在電腦上執行卻不行,所以自己改了一下,應該沒有問題了。include include include using namespace std int strtoint const char str if i...