2

我用 qt creator 创建了一个 qt 应用程序,代码是这样的,

#include "mainwindow.h"
#include <QDebug>
#include <QApplication>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  double before = atof("3.1");
  double x;
  sscanf("3.1", "%lf", &x);
  QApplication a(argc, argv);
  double after = atof("3.1");
  double y;
  sscanf("3.1", "%lf", &y);
  MainWindow w;
  w.show();
  qDebug() <<  before;
  qDebug() <<  after;
  qDebug() <<  x;
  qDebug() <<  y;
  return a.exec();
}

输出是

3.1
3
3.1
3

这意味着 sscanf 和 atof 在“QApplication a(argc, argv);”之后截断小数部分。该问题仅出现在 Linux Mint 17 下的 Qt5.3 中。我在 windows 8 和 Mac OS 10.9 中测试了相同的程序,它们没有相同的问题。它是 Linux Qt5.3 中的错误还是与 linux c 库有关?

完整的代码可以在这里访问

4

1 回答 1

2

请参阅QCoreApplication 文档

在 Unix/Linux 上,Qt 默认配置为使用系统区域设置。这可能会在使用 POSIX 函数时引起冲突,例如,在浮点数和字符串等数据类型之间进行转换时,因为不同语言环境的表示法可能不同。要解决此问题,请在初始化 QApplication 或 QCoreApplication 后立即调用 POSIX 函数 setlocale(LC_NUMERIC,"C") 以将用于数字格式化的语言环境重置为“C”语言环境。

我可以重现您的问题,以下代码为我修复了它:

QApplication a(argc, argv);
setlocale(LC_NUMERIC,"C");
于 2014-06-13T18:17:51.063 回答