2016-11-21 70 views
0

用下面的代码:大厦的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

目前还不清楚你在问什么,请将问题描述中的预期行为和当前行为以明确的方式加入。 – HopefullyHelpful

+0

他问为什么第一个示例代码在输出中打印垃圾字符。我试图在下面回答。 – selbie

+2

您可能需要使用QString :: arg()。这就是我所做的。 – drescherjm

回答

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 

一个重写你的表达,使之有效,更简练将使用ARG-替换机制的方式的QString

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

+0

谢谢。我现在明白了。你的回答很有帮助! – Sebastien

3

可以瑞普类似的结果更简单:

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

而现在发生是这个问题到底是什么。该表达式的第一部分是简单地:

"Datalogging Item" + ',' 

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

的解决方案是简单地声明第一元件是一个QString的,使得所有随后的“添加”,将使用重载+操作者的QString的:

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

所有你需要重现的是'std :: cout <<“Datalogging Item”+','':)不需要Qt。或者'printf(“%s \ n”,“Datalogging Item”+',');'。无需C++ :) –

+0

您的回答也有帮助! – Sebastien