c 中字串轉浮點數stod vs atof

2021-10-10 21:40:20 字數 1810 閱讀 7435

背景

程式需要從檔案中讀取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,並設定errnoerange

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...