Qt在Linux中不能正确读取string

那么我会试着解释一下。 我有一个名为计算类,评估一个string或常量字符*数字expression式,如“2 *(3/5)”或类似。

现在我正在尝试在Qt中构build一个计算器,使用这些类来评估QLineEdit的input。

class级的工作就是这样的:

Calc(const std::string &sExpresion); Calc(const char* cExpresion); 

 void anadirExpresion(const std::string &sExpresion); void anadirExpresion(const char* cExpresion); 

我试图在Qt中使用它:

 void Calculadora::evaluar() { QLocale locale; QByteArray cadena = ui->pantalla->text().toLocal8Bit(); const char* expresionAEvaluar = cadena.data(); qDebug()<<"Cadena a evaluar: "<<cadena; std::cout<<"Cadena: "<<expresionAEvaluar<<std::endl; evaluador.anadirExpresion(expresionAEvaluar); //evaluador is the class Calc instance float resultado=evaluador.CalcularExpresion(); qDebug()<<"Resultado: "<<resultado; ui->pantalla->setText(QString::number(resultado)); } 

这是一个尝试使用具有const char *expression式的类

这是一个std :: stringexpression式的尝试

 void Calculadora::evaluar() { //std::string cadena = ui->pantalla->text().toStdString(); //qDebug()<<"Cadena a evaluar: "<<ui->pantalla->text(); std::cout<<"Cadena: "<<ui->pantalla->text().toStdString()<<std::endl; evaluador.anadirExpresion(ui->pantalla->text().toStdString()); float resultado=evaluador.CalcularExpresion(); qDebug()<<"Resultado: "<<resultado; ui->pantalla->setText(QString::number(resultado)); } 

问题是我在“”之后丢失了数据。 字符。 如果我有“2.3”计算器perfoms“2”此外,这个问题是只在Linux中,因为在Windows下的Qt它运行正常。 在Linux和Windows下,它可以在控制台模式下正常工作。

此外,QDebug()和std :: cout的Qt控制台中的输出显示正确的string。

build议?

对不起,我的英语不好,感谢先进。

***更新:

明确地说,我认为这个错误是因为在linux下Qt编译的函数atof()不能正常工作。 我可以听起来毫无意义,但是,我正在追随“2.5”值来寻找它被改变的地方,然后它改变了(成为Calc的成员函数)

 EP[t].OP.operando=atof(aux); std::cout<<"changed? "<<aux<<std::endl; std::cout<<"changed: "<<EP[t].OP.operando<<std::endl; 

在控制台下,atof()函数之后的EP [t] .OP.operando值为“2.5”。 在Windows中也是如此。 但在Linux中,我得到“2”的价值。

现在我再试一次:

 char cad[]="2.5"; EP[t].OP.operando=atof(cad); std::cout<<"changed: "<<EP[t].OP.operando<<std::endl; 

在控制台下,EP [t] .OP.operando值= 2.5,但在Qt下是2

也许是一个错误? 有人确认吗?

谢谢

我怀疑区域设置踢英寸可能您的系统区域设置是一些欧洲语言,其中小数点分隔符是一个逗号,而不是一个点。

要验证我的暂停,您可以:

  • 尝试在测试过程中使用逗号( , )作为小数点分隔符
  • 暂时将您的系统语言环境更改为美国(或其他语言,其中点是十进制分隔符),然后重新运行软件。
  • 您可以打印此变量的日志值( 请参阅文档 ):

     qDebug() << "Decimal separator: " << localeconv()->decimal_point; 

如果我是对的,那么这不是一个错误,而是一个功能:)。


我写了一些测试应用程序来验证我的暂停,我是对的,我写了这个插槽:

 void MainWindow::processText(const QString &txt) { std::string s = txt.toStdString(); std::stringstream stream(s); double x; x = std::atof(s.c_str()); emit atofResultString(QString::number(x)); if (stream >> x) { emit stdstreamResult(QString::number(x)); } } 

我已经在Ubuntu 12.04上用波兰语区域设置测试过了。 结果是atof将系统区域设置考虑在内。

你可以告诉你函数evaluar()是否正常工作:

QByteArray cadena = ui->pantalla->text().toLocal8Bit(); const char* expresionAEvaluar = cadena.data();

如果正在工作,那么我建议你也使用相同的函数为std::string 。 这可以使用std::string::c_str()来完成。

所以你可以写ui->pantalla->text().toStdString().c_str()

但是,当你使用toLocal8bit()函数的时候,在QStringconst char*之间转换效果最好。

谢谢你的回答。

我试图改变我的程序的环境,添加一个QLocale指针,并在构造函数中:

 valor = new QLocale (QLocale::C,QLocale::UnitedStates);//valor is a QLocale pointer 

我已经明确地为我的国家改变了这个价值:

 valor = new QLocale (QLocale::Spanish,QLocale::Spain); 

此外,我试图改变“之间”。 和“,”在这两个环境(西班牙和美国)的小数点,

在又一次令人头疼的时候,你给了我一个想法,从stringstream对象中获取浮点值,而不是使用atof()函数。

 std::stringstream ss(aux); ss>>EP[t].OP.operando; 

现在它工作正常。 其实我没有解决这个问题(Locale问题),但我解决了这个问题。 我必须像SOLVED标志的职位?

再次感谢你!