gpt4 book ai didi

c++ - 为什么 Qt 会改变 sscanf() 的行为?

转载 作者:IT老高 更新时间:2023-10-28 22:39:10 36 4
gpt4 key购买 nike

我注意到,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(++) 字符数组。顺便说一句,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-array 字符串和 sscanf() 调用会受到 Qt 的影响?我理解为什么 QString 是本地化的,但是破坏 sscanf()(以及可能的其他 stdio.h 函数)对我来说听起来很邪恶。

背景:我将一个(非 Qt)库(在代码深处包含一个 sscanf())链接到一个 Qt 项目。结果:这个项目中的一些代码失败了,而它在其他地方都可以工作......(花了一些时间找到原因......)

最佳答案

一般来说,如果您在标准库中获得与流或 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

让事情回到你所期望的。

关于c++ - 为什么 Qt 会改变 sscanf() 的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20555696/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com