1. 程式人生 > >字串轉換為整形數字

字串轉換為整形數字

題目:輸入一個表示整數的字串,把該字串轉換成整數並輸出。例如輸入字串"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再加上當前字元表示的數字。這個思路用迴圈不難實現。
由於整數可能不僅僅之含有數字,還有可能以'+'或者'-'開頭,表示整數的正負。因此我們需要把這個字串的第一個字元做特殊處理。如果第一個字元是'+'號,則不需要做任何操作;如果第一個字元是'
-'號,則表明這個整數是個負數,在最後的時候我們要把得到的數值變成負數。
接著我們試著處理非法輸入。由於輸入的是指標,在使用指標之前,我們要做的第一件是判斷這個指標是不是為空。如果試著去訪問空指標,將不可避免地導致程式崩潰。另外,輸入的字串中可能含有不是數字的字元。每當碰到這些非法的字元,我們就沒有必要再繼續轉換。最後一個需要考慮的問題是溢位問題。由於輸入的數字是以字串的形式輸入,因此有可能輸入一個很大的數字轉換之後會超過能夠表示的最大的整數而溢位。
現在已經分析的差不多了,開始考慮編寫程式碼。首先我們考慮如何宣告這個函式。由於是把字串轉換成整數,很自然我們想到:
int StrToInt(const char
* str);

這樣宣告看起來沒有問題。但當輸入的字串是一個空指標或者含有非法的字元時,應該返回什麼值呢?0怎麼樣?那怎麼區分非法輸入和字串本身就是”0”這兩種情況呢?
接下來我們考慮另外一種思路。我們可以返回一個布林值來指示輸入是否有效,而把轉換後的整數放到引數列表中以引用或者指標的形式傳入。於是我們就可以宣告如下:
bool StrToInt(const char *str, int& num);
這種思路解決了前面的問題。但是這個函式的使用者使用這個函式的時候會覺得不是很方便,因為他不能直接把得到的整數賦值給其他整形變臉,顯得不夠直觀。
前面的第一種宣告就很直觀。如何在保證直觀的前提下當碰到非法輸入的時候通知使用者呢?一種解決方案就是定義一個全域性變數,每當碰到非法輸入的時候,就標記該全域性變數。使用者在呼叫這個函式之後,就可以檢驗該全域性變數來判斷轉換是不是成功。
下面我們寫出完整的實現程式碼。參考程式碼:
enum Status {kValid = 0, kInvalid};
int g_nStatus = kValid;

///////////////////////////////////////////////////////////////////////
// Convert a string into an integer
///////////////////////////////////////////////////////////////////////
int StrToInt(const char* str)
{
       g_nStatus = kInvalid;
      
longlong num = 0;

      if(str != NULL)
       {
            const char* digit = str;

            // the first char in the string maybe '+' or '-'
            bool minus = false;
            if(*digit == '+')
                   digit ++;
            else if(*digit == '-')
             {
                   digit ++;
                   minus = true;
             }

            // the remaining chars in the string
            while(*digit != '/0')
             {
                  if(*digit >= '0' && *digit <= '9')
                   {
                         num = num * 10 + (*digit - '0');

                        // overflow  
                        
if(num > std::numeric_limits<int>::max())
                         {
                               num = 0;
                               break;
                         }

                         digit ++;
                   }
                  // if the char is not a digit, invalid input
                  else
                   {
                         num = 0;
                        break;
                   }
             }

            if(*digit == '/0')
             {
                   g_nStatus = kValid;
                  if(minus)
                         num = 0 - num;
             }
       }

       returnstatic_cast<int>(num);
}

討論:在參考程式碼中,我選用的是第一種宣告方式。不過在面試時,我們可以選用任意一種宣告方式進行實現。但當面試官問我們選擇的理由時,我們要對兩者的優缺點進行評價。第一種宣告方式對使用者而言非常直觀,但使用了全域性變數,不夠優雅;而第二種思路是用返回值來表明輸入是否合法,在很多API中都用這種方法,但該方法宣告的函式使用起來不夠直觀。
最後值得一提的是,C語言提供的庫函式中,函式atoi能夠把字串轉換整數。它的宣告是int atoi(const char*str)。該函式就是用一個全域性變數來標誌輸入是否合法的。

相關推薦

字串轉換整形數字

題目:輸入一個表示整數的字串,把該字串轉換成整數並輸出。例如輸入字串"345",則輸出整數345。分析:這道題儘管不是很難,學過C/C++語言一般都能實現基本功能,但不同程式設計師就這道題寫出的程式碼有很大區別,可以說這道題能夠很好地反應出程式設計師的思維和程式設計習慣,因

字串轉換數字

C當中有一些函式專門用於把字串形式轉換成數值形式。 printf()函式和sprintf()函式 -->通過轉換說明吧數字從數字形式轉換為字串形式; scanf()函式把輸入字串轉換為數值形式; 應用場景: 編寫程式需要使用數值命令形參,但是命令形參被讀取為字串。要使用數值必須先把字串轉換為數字

stof()、atoi()、atol()、strtod()、strtol()、strtoul() 共6個可以將字串轉換數字的函式

標頭檔案:#include <stdlib.h> atoi() 函式用來將字串轉換成整數(int),其原型為: int atoi (const char * str); 【函式說明】atoi() 函式會掃描引數 str 字串,跳過前面的空白字元(例如空格,tab縮排等,可以通過 

python中,如何將字串轉換數字(將數字轉換整型),字串的10轉換整型的10,10.5轉換10

說明:   在實際的應用過程中,有的時候可能會遇到字串的10,需要將字串的10轉換為數字的10   在此記錄下,通過int函式轉換的過程。 操作過程: 1.將字串轉換為整型的10 >>> str1 = "10" #將一個字串的10賦給變數str1 >&g

String純數字字串轉換int值

下面有兩個方法:  public static int parseInt(String str){ /*int sum = 0; for(int i = 0; i < str.length(); i++){

數字字串轉換整型數

題目內容: 從鍵盤輸入一串字元(假設字元數少於8個),以回車表示輸入結束,程式設計將其中的數字部分轉換為整型數並以整型的形式輸出。    函式原型為 int Myatoi(char str[]); 其中,形引數組str[]對應使用者輸入的字串,函式返回值為轉換後的整型

字串轉換數字程式碼For intput String問題的解決

在串列埠資料傳輸時,如何將一個串列埠傳輸過來的字串轉化為數字?通過分析數字的特徵來獲得想要的資訊,解決了好久,今天處理了這個問題,寫一點東西。 問題描述: 將一個字串轉化為數字,如String str =“123”;轉化為 int num=123;我的實現程式碼是這個樣子的, impor

jquery中把字串轉換數字

其實在jquery裡把字串轉換為數字,用的還是js,因為jquery本身就是用js封裝編寫的。 比如我們在用jquery裡的ajax來更新文章的閱讀次數或人氣的時候,就需要用到字串轉換為數字的功能了, 先來看看JS裡把字串轉換為數字的函式命令: 1:parseInt(str

Oracle將字串轉換數字,並替換特殊字元

分類: Oracle(22) Oracle自帶有to_number函式,但需要說明的是這個函式只能轉換字串格式是正確數字的情況, 也就是一旦字串為空,或者有特殊字元,或者有空格等等,都會拋錯,以下提供一種方式成功解決以上問題: TO_NUMBER(decode(deco

Java中數字轉換字串字串轉換字元

String str = "123"; int num = 12; //字串轉換為數字 int tranToNum = Integer.parseInt(str, 16);//這裡的16表示十六進位制

劍指Offer面試題:35.將字串轉換數字

一、題目:將字串轉換為數字 題目:寫一個函式StrToInt,實現把字串轉換成整數這個功能。當然,不能使用atoi或者其他類似的庫函式。 二、程式碼實現   (1)考慮輸入的字串是否是NULL、空字串   (2)考慮輸入的字串是否包含正負號或者是否是隻包含正負號   (3)考慮輸入的字串是否

js將某個值轉換String字串型別或轉換Number數字型別

將某個值轉換為String型別 1. value.toString() toString()方法返回一個表示該物件的字串 var a = 123 a.toString() // '123' 2. "" + value 一元加法運算子的作用是數值求和,或者字串拼接。有字串,則是字串拼接。其他是數字相加求和

c語言字串轉換16進位制和10進位制數字

字串轉換為16進位制或者10進位制:1、使用自己編寫的函式。2、使用庫函式。 將字串轉換為16進位制兩種方法的程式碼: #include<stdio.h> #include<string.h> #include<stdlib.h>  in

atoi 字串轉換數字

#include <iostream> #include <typeinfo> #include <cmath> #include <cctype> u

Python不使用int()函式把字串轉換數字

不使用int()函式的情況下把字串轉換為數字,如把字串"12345"轉換為數字12345。 方法一:利用str函式 既然不能用int函式,那我們就反其道而行,用str函式找出每一位字元表示的數字大寫。 def atoi(s): s = s[::-1] num

C#字串轉換數字的4種方法

判斷C#中的字串是否是數字,如果是轉換成int型別 1.通過正則表示式(可以判斷正數和負數) public int IsNumeric(string str)         {             int i;             if (str != null

字串轉換數字-Java版

package po.ag; /** * 1.首先判斷字串是否為空,若為空,返回0 * 2.考慮前面的是否是空格,使用trim()去掉,然後判斷長度是否為0,若是,返回0 * 3.判斷第一個字元

字串轉換數字

1、 題目 把字串轉換成整數 2、思路 1.功能測試 正數/複數/0 2.邊界值測試 最大的正整數/最小的負整數(資料上下溢位) 3.特殊輸入測試 空字串“”的處理,返回0,設定非法輸入 字串只有符號位的處理,返回0,設定非法輸入 輸入的

(javascript)string字串型別轉換number數字型別

string字串型別轉換為number數字型別原文來自:https://blog.csdn.net/dolphin_xujing/article/details/52691990string字串型別轉換為number數字型別1、五種方法Number() 、parseInt()

Java中金額數字轉換大寫數字

main out pack poi java void val pre ins 註:該代碼來自於別人,我引入進來並修改了裏面的幾個bug.現在寫進我的博客裏,以便於日後查看,和為其它博友們提供方便 修改bug地方:1.金額為0時,不加整。以前是零元整,現在是零元 2.