gpt4 book ai didi

c++ - Qt 在 Linux 中无法正确读取字符串

转载 作者:太空狗 更新时间:2023-10-29 12:31:55 25 4
gpt4 key购买 nike

好吧,我会尽力解释。我有一个名为 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.operando 值在 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;

console下,EP[t].OP.operando value = 2.5,Qt下为2

也许是一个错误?有谁证实这一点吗?

谢谢

最佳答案

我怀疑语言环境起作用了。可能您的系统语言环境是某种欧洲语言,其中小数点分隔符是逗号,而不是点。

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

  • 在测试期间尝试使用逗号 (,) 作为小数点分隔符或
  • 暂时将您的系统区域设置更改为美国(或点为小数点分隔符的其他语言),然后重新运行您的软件。
  • 您可以在日志中打印此变量的值 (see documentation):

    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 将系统区域设置考虑在内。

关于c++ - Qt 在 Linux 中无法正确读取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24180055/

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