把字符串轉換成整數


題目:輸入一個表示整數的字符串,把該字符串轉換成整數並輸出。例如輸入字符串"345",則輸出整數345。

 

轉換的思路:每掃描到一個字符,我們把在之前得到的數字乘以10再加上當前字符表示的數字。這個思路用循環不難實現。

注意事項:(1)由於整數可能不僅僅之含有數字,還有可能以'+'或者'-'開頭,表示整數的正負。因此我們需要把這個字符串的第一個字符做特殊處理。如果第一個字符是'+'號,則不需要做任何操作;如果第一個字符是'-'號,則表明這個整數是個負數,在最后的時候我們要把得到的數值變成負數。

(2)處理非法輸入。  

     (a)由於輸入的是指針,在使用指針之前,我們要做的第一件是判斷這個指針是不是為空。如果試着去訪問空指針,將不可避免地導致程序崩潰。

     (b)輸入的字符串中可能含有不是數字的字符。每當碰到這些非法的字符,我們就沒有必要再繼續轉換。

     (c)最后一個需要考慮的問題是溢出問題。由於輸入的數字是以字符串的形式輸入,因此有可能輸入一個很大的數字轉換之后會超過能夠表示的最大的整數而溢出。

 

    首先我們考慮如何聲明這個函數。由於是把字符串轉換成整數,很自然我們想到:

int StrToInt(const char* str);

  這樣聲明看起來沒有問題。但當輸入的字符串是一個空指針或者含有非法的字符時,應該返回什么值呢?0怎么樣?那怎么區分非法輸入和字符串本身就是”0”這兩種情況呢?即0所代表的含義不明確,不知道到底是整數0還是空指針,亦或是含有非法字符的字符串;

    接下來我們考慮另外一種思路。我們可以返回一個布爾值來指示輸入是否有效,而把轉換后的整數放到參數列表中以引用或者指針的形式傳入。於是我們就可以聲明如下:

bool StrToInt(const char *str, int& num);

  這種思路解決了前面的問題。但是這個函數的用戶使用這個函數的時候會覺得不是很方便,因為他不能直接把得到的整數賦值給其他整形變量,顯得不夠直觀。

      前面的第一種聲明就很直觀。如何在保證直觀的前提下當碰到非法輸入的時候通知用戶呢?一種解決方案就是定義一個全局變量,每當碰到非法輸入的時候,就標記該全局變量。用戶在調用這個函數之后,就可以檢驗該全局變量來判斷轉換是不是成功。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM