Qt在Linux中无法正确读取字符串
Qt doesn't read a string properly in Linux
好吧,我会尽力解释的。我有一个名为Calc的类,它计算字符串或const char*数字表达式,如"2*(3/5)"或类似的。
现在我正试图在Qt中建立一个计算器,使用这些类来评估QLineEdit的输入。
这个类是这样工作的:
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*表达式
的类的尝试这是对std::string表达式
的尝试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"计算器的结果是"2"此外,这个问题只在Linux中存在,因为在Windows下的Qt中它可以正常运行。它在Linux和Windows的控制台模式下运行良好。
同时,qDebug()和std::cout在Qt控制台中输出一个正确的字符串。
建议吗?
很抱歉我的英语不好,提前感谢。
* * *更新:
明确地说,我认为这个错误是因为在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;
在控制台下,EP[t]. op。atof()函数后,操作值为"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 value = 2.5,但Qt下为2
可能是bug?有人能证实吗?
谢谢
我怀疑区域设置起了作用。可能您的系统区域设置是某种欧洲语言,其中小数分隔符是逗号,而不是点。
要验证我的悬架,您可以:
- 尝试在测试期间使用逗号(
,
)作为小数分隔符或 - 暂时将您的系统语言环境更改为US(或其他语言,点是十进制分隔符),然后重新运行您的软件。
-
你可以在日志中打印这个变量的值(见文档):
qDebug() << "Decimal separator: " << localeconv()->decimal_point;
如果我是对的,那么这不是一个bug,而是一个功能:)。
我写了一些测试应用程序来验证我的悬架,我是对的,我写了这个插槽:
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()
函数时,QString
和const char*
之间的转换效果最好,因为您已经做过一次。
谢谢你的回答。
我试图改变我的程序的环境,添加一个QLocale指针,并使其在构造函数:
valor = new QLocale (QLocale::C,QLocale::UnitedStates);//valor is a QLocale pointer
我已经明确地为我的国家/地区改变了这个值:
valor = new QLocale (QLocale::Spanish,QLocale::Spain);
我还尝试在两种环境(西班牙和美国)的小数点之间更改"。"answers","
在另一个头痛之后,你给了我一个想法,从stringstream对象中获取float valor,而不使用atof()函数。
std::stringstream ss(aux);
ss>>EP[t].OP.operando;
现在它工作得很好。实际上我还没有解决这个问题(语言环境问题),但我绕过它来修复它。我必须在帖子上标记"已解决"吗?
再次感谢您!
- 如何使用Luacneneneba API正确读取字符串和表参数
- 如何从二进制文件中读取字符串
- 如何在 c++ 中使用 getline 从文件中读取字符串?
- 读取字符串文本输入以创建 2D 矢量
- 罗马数字到阿拉伯语 (vinculum) - 读取字符串中的字符
- C++:从文件中读取字符串和整数,并获得最大数字
- C++,从文件中读取字符串,分段错误
- 如果语句错误地读取字符串,则始终在第一个条件返回
- 如何从内存中读取字符串?
- 如何创建一个C++程序来读取字符串数组中的信息,然后将其排序到类中?
- 我需要C++读取字符串数组中每个单词的第一个字母
- 读取字符串C++的字符时出错
- 读取字符串直到标志 (C++)
- 读取字符串字符时出错 - 对于数组中的字符串值
- C++输入文件流无法从文件中读取字符串
- 读取字符串字符时出错
- 如何读取<字符串,矢量<对<int,字符串的映射>>>
- 如何使此函数使用 getline 读取字符串并使用 int 执行相同的行为?
- C++ 使用 Strtok 读取字符串字符时出错
- 使用 getline 读取字符串,但每行中都有换行符