[英]Why does Qt change behaviour of sscanf()?
我注意到,Qt(4.8)改變了sscanf()
的行為。 沒有Qt sscanf()
像往常一樣工作,但是,它只需要本地化的字符串。
這是一個最小化的例子:
int main(int argc, char *argv[])
{
float f;
sscanf("0.83", "%f", &f);
std::cout << f << "\t-->\t" << typeid("0.83").name() << std::endl;
return 0;
}
輸出:
0.83 --> A5_c
(給定字符串是5x char
-array,結果正確)
int main(int argc, char *argv[])
{
/*
* This breaks sscanf() for the whole (!) project
* and linked libraries too!
*/
QApplication(argc, argv);
float f;
sscanf("0.83", "%f", &f);
std::cout << f << "\t-->\t" << typeid("0.83").name() << std::endl;
return 0;
}
輸出:
0 --> A5_c
(給定字符串仍然是5x char
-array,但結果是錯誤的)
雖然0.83
失敗,但使用0,83
(我的語言環境格式)可以正常使用Qt - 但是在沒有Qt(默認行為)的情況下失敗。 如typeid()
所示,沒有使用QString
- 只有普通的舊C(++)char數組。 順便說一下, std::string
。
除此之外,使用std::stringstream
保持正常工作:
std::stringstream ss;
ss << "0.83"; // But the value into the stream
ss >> f; // Get a float out of it
結果:
0.83
這里有一個問題:為什么char數組字符串和sscanf()
調用受Qt影響? 我理解為什么QString
是本地化的,但是破壞sscanf()
(以及可能的其他stdio.h
函數)對我來說聽起來很邪惡。
背景:我將一個(非Qt)庫鏈接到一個Qt項目,該庫包含代碼深處某處的sscanf()
。 結果:有些代碼在這個項目中失敗了,而它在其他地方都有用......(花了一些時間才找到原因...)
一般而言,如果您在標准庫中獲得了與流或I / O操作有關的功能,則可能會受到您的語言環境設置的影響。
對於sscanf
也是如此,在您的情況下,Qt會覆蓋使用默認C / C ++配置時通常會遇到的默認C locale
。
你應該使用
setlocale(LC_NUMERIC,"C")
在初始化Qt環境之后,在這種情況下,在QApplication
之后。
https://qt-project.org/doc/qt-5/qcoreapplication.html#locale-settings
把事情重新設定為你所期望的。
Qt正在調用setlocale來設置C runtuime以使用您的語言環境。 您可以嘗試使用setlocale(LC_ALL,“C”)進行設置; 但我不確定這會如何影響Qt的其余部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.