簡體   English   中英

scanf,printf和boost :: lexical_cast本質上是不安全的嗎?

[英]Are scanf, printf and boost::lexical_cast fundamentally unsafe?

我最近遇到了一個將十進制字符串(例如"10.057" )轉換為double 這個問題是與全球應用的語言環境,使用boost::lexical_cast和一些歐洲語言環境中使用的事實,為小數點。

該家族中的scanfprintf和其他功能存在相同的問題。

我很想聽聽其他人如何處理這個問題。

scanfprintfboost::lexical_cast和相關功能的行為取決於全局應用程序區域設置。 因此,它們相對於其輸入參數是不確定的。 我看過類似的代碼:

std::setlocale(LC_ALL, "C");
scanf(...);

但是,這不能保證在多線程環境中工作。

一種解決方案是使用允許用戶顯式指定語言環境的函數和類型。

iostream流對象允許用戶將語言環境指定為參數,這將產生確定性的結果。

std::istringstream istr("10.057");
istr.imbue(std::locale::classic());

double val;
istr >> val;

同樣, boost::format允許用戶將語言環境指定為參數。

using boost::format;
std::string s = str(format("%lf", std::locale::classic()) % 10.057);

另請參閱上一個stackoverflow問題中的討論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM