簡體   English   中英

為什么Qt會改變sscanf()的行為?

[英]Why does Qt change behaviour of sscanf()?

我注意到,Qt(4.8)改變了sscanf()的行為。 沒有Qt sscanf()像往常一樣工作,但是,它只需要本地化的字符串。

這是一個最小化的例子:


沒有Qt(普通C ++)

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,結果正確)


隨着Qt

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會根據您的系統區域設置自動設置區域設置。 實際上有一個標准的本地化庫

設置C語言環境會更改此頁面上列出的一系列函數的行為。

但請注意,C ++流不會自動獲取C語言環境,這就是您的std::stringstream正常運行的原因。

Qt正在調用setlocale來設置C runtuime以使用您的語言環境。 您可以嘗試使用setlocale(LC_ALL,“C”)進行設置; 但我不確定這會如何影響Qt的其余部分。

暫無
暫無

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

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