背景
程式需要從檔案中讀取double精度的資料。
隨著程式的更新,檔案也會更新。但有時候,更新了檔案,卻忘記更新程式,這時啟動程式時,就會coredump。
gdb coredump也很容易看出問題,但不能一出問題就讓程式crash啊。
於是加了try來catch異常,但是無果,還是dump,於是查了一下,發現了atof的問題。
stod vs atof
atof是c**裡的庫函式,用於把字串轉換為double精度的數字,原型如下:
#include
double atof (
const
char
* str)
;
返回值:
正常的情況都不用說了,這不正常的情況,似乎也太不正常了。
所以使用它時,要注意處理後兩種情況,看看到底是正常的0,還是無效的輸入。
未定義的行為,相信c++程式設計師早已不陌生了,直接認慫就好。
注意,strtod
跟它差不多,有一點好的,是第三種情況,它會返回正的/負的huge_val
,並設定errno
為erange
。
stod是標準c++庫函式,在c++11中得到了支援,它把引數指定的字串轉換為double精度的浮點數。
單看上面一句話,是不是就得秒殺atof了。
原型如下:
#include
double stod (
const string& str, size_t* idx =0)
;double stod (
const wstring& str, size_t* idx =0)
;
其中,idx不是空指標時,該函式還將idx的值設定為數字後str中第乙個字元的位置。
返回值:
這裡提一下,該函式底層使用 strtod 執行轉換。
所以,它對於不能夠進行有效轉換的情況,都會丟擲異常,我們try一下就catch住了。
它的兄弟有:std::stof**換為float單精度), std::stold**換為long double長雙精度),stoi,stol,stoll,stoul,stoull, from_chars(c++17,轉換字串行)。
對於空字串
這裡有乙個問題需要注意,就是當輸入的引數字串為空時,兩個函式返回的結果並不相同。
如果希望的是,當字串為空時,返回0,那麼atof
可以完美達到需求。
如果希望字串空時,丟擲異常,則stod
就是這樣做的,因為空白的字串不能進行轉換。
它們對應於兩種不同的需求,如果認為輸入的字串為空時需要介入處理,使用stod
仍然是最佳選擇,而如果認為返回0
就ok了,那麼當使用stod
時就要進行處理前的判斷了。
測試**如下:
#include
#include
#include
using
namespace std;
intmain()
catch
(const exception& e)
return0;
}
執行結果如下:
% ./a.out
atof: 0
ex: stod
小結
如果符合以下情況:
那就使用stod系列函式吧,否則就使用atof。
整數(浮點數)轉字串
在實際專案中,我們不可避免的遇到需要將整數 浮點數 轉換為字串輸出 儲存為檔案或者顯示列印 這是乙個很常見的演算法,標準c庫甚至提供了諸如itoa,ltoa,之類的函式供大家呼叫。但是,在一些特殊場合,比如對功耗要求比較苛刻的場合,則對轉換速度提出了要求。在微控制器應用中,很多mcu沒有除法器,和除...
C51 浮點數轉字串函式
微控制器浮點數轉字串可以使用 stdio.h 中sprintf函式,但 體積和ram占用空間比較大。自己寫的程式又不太好。在學習gps資料解析過程中用到了leiouyang的gps解析庫,在其中有浮點數轉字串函式,現推薦給大家。一下是完整的基於keil c51 的c檔案 include includ...
C語言浮點數轉字串實現函式
c語言浮點數轉字串可用庫函式sprintf,此處為編寫的簡單函式。小數部分最多顯示六位。pout 輸出字串緩衝區 f 浮點數值 isize 輸出字串緩衝區大小 char funftoa char pout,float f,unsigned char isize itmpnum f f f itmpn...