@函式名稱:
atol
函式原型:
long
atol
(cha
r *str)
函式功能:
將字串轉換成乙個長整數
函式返回:
轉換後的數值
引數說明:
str-待轉換為長整型的字串
所屬檔案:
#include
#include
int ma
in()
把字串轉換成整數
收藏 題目:
輸入乙個表示整數的字串
,把該字串轉換成整數並輸出。
例如輸入字串"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
;int
g_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(num);
}討論:在參考**中,我選用的是第一種宣告方式。不過在面試時,我們可以選用任意一種宣告方式進行實現。但當面試官問我們選擇的理由時,我們要對兩者的優缺點進行評價。第一種宣告方式對使用者而言非常直觀,但使用了全域性變數,不夠優雅;而第二種思路是用返回值來表明輸入是否合法,在很多api中都用這種方法,但該方法宣告的函式使用起來不夠直觀。
最後值得一提的是,在c語言提供的庫函式中,函式atoi能夠把字串轉換整數。它的宣告是int
atoi(const
char
*str)。該函式就是用乙個全域性變數來標誌輸入是否合法的
將數字轉化為字串
將數字轉化為字串 方法一 include int main void temp 0 scanf d num number num do while number 0 string i 0 printf number d,位數是 d位 n num,i 統計出位數 for j 0,i j i 2 j i...
字串轉化為陣列,陣列轉化為字串。
做題中常遇到字串轉化為數字,數字轉化為字串等,自己轉化比較麻煩,c語言提供了幾個標準庫函式,可以將任意型別 整型 長整型 浮點型等 的數字轉換為字串。1.整數轉化為字串。itoa include include int main itoa 函式有3個引數 第乙個引數是要轉換的數字,第二個引數是要寫入...
將字串轉化為整數輸出。
今天我們來看一道經典面試題 編寫程式實現字串到整數的轉換,例如輸入 12345 輸出整數12345.首先如果我們不想細究其中的各種情況問題,可以用乙個十分簡單粗暴的方法來解決。就是庫中的atoi函式 它是專門將字串轉換成整數的函式。其次最簡單的方法就是通過乙個簡單的迴圈得到結果,但是這個方法並不考慮...