1. 程式人生 > >atoi函式,字串轉換為整數

atoi函式,字串轉換為整數

題目:輸入一個表示整數的字串,把該字串轉換成整數並輸出。例如輸入字串"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;
	long 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;
		}
	}
	return static_cast<int>(num);
}


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

相關推薦

atoi函式字串轉換整數

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

[C/C++筆面試]不使用庫函式字串轉換整數

與數字轉換為字串類似,C/C++提供了幾個標準的庫函式,可以將字串轉換為任意型別(整型,長整型,浮點型)的數字。下面列舉其函式 atof();將字串轉換為雙精度浮點型值 atoi();將字

實現atoi這個函式將一個字串轉換整數。如果沒有合法的整數返回0。如果整數超出了32位整數的範圍返回INT_MAX(2147483647)如果是正整數

public class Solution {    /**     * @param str: A string     * @return: An integer     */    public int atoi(String str) {        // write your code here 

字串轉換整數的原始碼atoi()

#define is_digit(c)((c) >= '0' && (c) <= '9') static int skip_atoi(const char **s) { int i=0; while (is_digit(**s)) i = i*

實現atoi字串轉換整數

leetcode第八題:仔細考慮所有可能的輸入情況。如果您想要一個挑戰,請不要在下面看到並問您自己什麼是可能的輸入情況。在找到第一個非空白字元之前,函式首先會丟棄許多空白字元。然後,從這個字元開始,取一個可選的初始加號或減號,然後儘可能多的數字數字,並將其解釋為一個數值。字串

演算法2:IP字串轉換整數

關鍵技術點      將IP地址轉化成整數的方法如下:  通過String的indexOf方法找出IP字串中的點"."的位置。  根據點的位置,使用String的substring方法把IP字串分成4段。  使用Long的parseLong方法把子段轉化成一個3位整數。

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

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

【技巧】函式sscanf(字串轉化整數)sprintf(整數轉化字串)

sscanf(字串轉化為整數)和sprintf(整數轉化為字串)都只適用於“123456”這種字串 sscanf是將字串轉化為整數(或其它型別,這裡用較為),格式為   sscanf(字串的名字,"%d",整型變數的名字); sscanf還可以分離整數和其它字元,下舉一

《劍指Offer》面試題:將字串轉換整數

題目 題目:把字串轉化為整數 ,若輸入無效,則返回0且將標誌位設為true 自己以前在一些書上面看到過關於 字串轉化為整數的例子,心中有點印象,知道要考慮一些特殊情況。今天決定寫下這段程式碼,發現程式碼寫的稀爛,重複度太大,需要改善。 剛實現的程

如何從使用者輸入將字串轉換整數型別並鍵入Double?

/** * MadLib.java * * @author: Jackie Hirsch * Assignment: Madlib * * Brief Program Description: This program has will read a mad

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

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

字串轉換整數

這是一道經典的面試題,在收到這樣一道題時我們不要急於動手,先思考一下這道題的解決思路: 1.在函式呼叫時我們需要用指標來接收陣列的地址,那麼指標是否需要判空? 2.如果獲取的字串起始位出現“+”"-"號該如何處理? 3.如果獲取到的並非數字字串該如何處理? 4.如果獲

字串轉換整數”123“->123

字串轉換為整數”123“->123 題目描述: 輸入一個由數字組成的字串,把它轉換成整數並輸出。例如:輸入字串"123",輸出整數123。 給定函式原型 int StrToInt(const char *str) ,實現字串轉換成整數的功能,不能使用庫函式atoi。 題目分析: 將字串正確轉化為

[Swift]庫函式atoi:將字串內容轉換整數

1、如果第一個非空格字元存在,是數字或者正負號則開始做型別轉換,之後檢測到非數字(包括結束符 \0) 字元時停止轉換,返回Int32整形數。否則,返回0。 1 //返回Int32位整形 2 print(atoi("123456")) 3 //Print 123456 4 print(atoi("

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

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

字串轉換整數atoi函式的具體實現

程式碼如下: #include "stdio.h" int Atoi(char* str) {int sum=0;while(*str!='\0'){if (*str>='0' && *str<='9'){sum=sum*10+*str-'0';

實現一個函式把一個字串轉換整數

作者:翁鬆秀 劍指offer之“把一個字串轉換成整數” 很多人看到這麼簡單的面試題目,都是大筆一揮,立馬寫下洋洋灑灑函式: int StringToInt(char* string){ int num = 0; while(*str

編寫一個函式實現atoi()函式即把字串數字轉變數字

#include<iostream> #include<ctype.h> #include <math.h> using namespace std; int l

接收從鍵盤輸入的字串格式的年齡分數和入學時間 轉換整數、浮點數、日期型別並在控制檯輸出(型別轉換

package test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scann

C:atoi 字串轉換整數

int atoi(char *str) { int sign=1; int result=0; //去前導空白 while (isspace(*str)) { str++; } //判斷正負 if (*str=='-') {