[英]Are scanf, printf and boost::lexical_cast fundamentally unsafe?
我最近遇到了一個將十進制字符串(例如"10.057"
)轉換為double
。 這個問題是與全球應用的語言環境,使用boost::lexical_cast
和一些歐洲語言環境中使用的事實,
為小數點。
該家族中的scanf
, printf
和其他功能存在相同的問題。
我很想聽聽其他人如何處理這個問題。
scanf
, printf
, boost::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.