构建 QString 输出字符串

问题描述 投票:0回答:3

使用以下代码:

QString msg;
msg =   "Datalogging Item"          + ',' +
        QString::number(item)       + ',' +
        "Slave Index"               + ',' +
        QString::number(slaveIndex) + ',' +
        "Slave Name"                + ',' +
        slaveName                   + ',' +
        "Experiment Index"          + ',' +
        QString::number(expIndex)   + ',' +
        "Experiment Name"           + ',' +
        expName                     + ',' +
        "Aquisition Frequency "     + ',' +
        "33 Hz"                     + "\n";
qDebug() << msg;

我得到以下调试输出

"riment Index0,Slave Index,0,Slave Name,Execute 1,Experiment Index,0,Experiment Name,Read All (Barebone),Aquisition Frequency ,33 Hz\n"

这并不是我真正期望得到的。

但是使用 QString 类型转换修改代码:

QString msg;
msg =   QString("Datalogging Item")     + QString(',') +
        QString::number(item)           + QString(',') +
        QString("Slave Index")          + QString(',') +
        QString::number(slaveIndex)     + QString(',') +
        QString("Slave Name")           + QString(',') +
        slaveName                       + QString(',') +
        QString("Experiment Index")     + QString(',') +
        QString::number(expIndex)       + QString(',') +
        QString("Experiment Name")      + QString(',') +
        expName                         + QString(',') +
        QString("Aquisition Frequency ")+ QString(',') +
        QString("33 Hz")                + QString("\n");
qDebug() << msg;

我得到了我期望得到的:

"Datalogging Item,0,Slave Index,0,Slave Name,Execute 1,Experiment Index,0,Experiment Name,Read All (Barebone),Aquisition Frequency ,33 Hz\n"

你知道发生了什么事吗?我只是不明白发生了什么,我是 QT 的新手。

谢谢。

c++ string qt qstring
3个回答
3
投票

您可以更简单地重现类似的结果:

 msg =   "Datalogging Item" + ',' +  QString::number(item);

现在看来这正是问题所在。 该表达式的第一部分很简单:

"Datalogging Item" + ','

在上面的表达式中,原始字符串文字将整数值 44(逗号的 ascii val)添加到其指针地址。因此,您现在处于“未定义”区域,因为

"Datalogging Item"
的长度远小于 44 个字符。最有可能发生的情况是,上面的表达式现在是一个指针表达式,指向附近定义的其他字符串文字之一的中间。

解决方案很简单,将 first 元素声明为 QString,以便所有后续“添加”都将使用 QString 的重载

+
运算符:

msg =   QString("Datalogging Item") + ',' +
        QString::number(item)       + ',' +
        ...

1
投票

表情

"Datalogging Item" + ','

具有

的类型和含义
static_cast<const char *>("Datalogging Item" + 44)

您将获取

Datalogging
字符串常量的开头地址,并向其添加 44 - 将其前进 44 个字符。当您将指针移过它指向的对象时,这是未定义的行为。巧合的是,指针恰好指向另一个 C 字符串常量。

重现该问题的简短程序:

#include <iostream>
int main() {
  std::cout << "Datalogging Item Foo Bar Baz" + '\n' << std::endl;
}

输出:

g Item Foo Bar Baz

重写表达式以使其有效且不那么冗长的一种方法是使用

QString
的 arg 替换机制:

auto msg = QStringLiteral(
  "Datalogging Item,%1,Slave Index,%2,Slave Name,%3,Experiment Index,%4,"
  "Experiment Name,%5,Acquisition Frequency,%6\n")
   .arg(item).arg(slaveIndex).arg(slaveName).arg(expIndex)
   .arg(expName).arg(QStringLiteral("33 Hz"));

如果您使用的是 Qt 4,请将

QStringLiteral
替换为
QString::fromUtf8
QStringLiteral
是 Qt 5 中引入的一种机制,它在编译时构建常量
QString
实例,比使用
QString
构造函数产生更小的代码和更好的运行时性能。


0
投票

代码中静态字符串最好使用 QStringLiteral 宏。

msg = QStringLiteral("Datalogging Item") + ',' +

更多信息在这里:http://doc.qt.io/qt-5/qstring.html#QStringLiteral

© www.soinside.com 2019 - 2024. All rights reserved.