构建QString输出字符串

时间:2016-11-21 01:13:51

标签: c++ string qt qstring

使用以下代码:

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的新手。

感谢。

3 个答案:

答案 0 :(得分:3)

你可以更简单地重复类似的结果:

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

现在它恰好是问题所在。该表达式的第一部分就是:

"Datalogging Item" + ','

在上面的表达式中,原始字符串文字的整数值为44(逗号的ascii val)添加到它的指针地址。因此,您现在处于“未定义”区域,因为"Datalogging Item"的长度远小于44个字符。最有可能的是,上面的表达式现在是指向附近定义的其他字符串文字中间的指针表达式。

解决方案只是将第一个元素声明为QString,以便所有后续“添加”将使用QString的重载+运算符:

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

答案 1 :(得分: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::fromUtf8QStringLiteral是Qt 5中引入的一种机制,它在编译时构建一个常量QString实例,与使用QString构造函数相比,产生更小的代码和更好的运行时性能。

答案 2 :(得分:0)

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

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

此处有更多信息:http://doc.qt.io/qt-5/qstring.html#QStringLiteral