以下代码摘自我的Qt程序,该程序将多个文件名作为多个QLineEdits的输入,并在按下按钮时将文件合并为一个。我最初在C ++中编写代码作为命令行工具,现在当我尝试将来自QLineEdits的输入作为const char * argv []提供给命令行工具时出现问题。
问题是,由于某种原因,命令行代码将argv [1]和argv [2]作为第二个文件,而Qt代码向我保证argv [1]是第一个和argv [2]是第二个。
void VLay::condenseReflectanceFiles()
{
/**makes argv for wo_condense**/
const char* argv[size+1];
/**initialize first entry which wo_condense, when ran in terminal, thinks is the executable**/
argv[0] = NULL;
/**converts the text in the LineEdits into character strings and adds to argv**/
for(int k=0; k<size; k++)
{
argv[k+1] = fileList[k]->text().toUtf8();
//cout<< argv[k+1];
}
/**add one for the initial executable entry**/
wo_condense_R(size+1, argv);
}
int wo_condense_R(int argc, const char * argv[])
{
cout<< argv[1];
cout<< argv[2];
return 0;
}
这里理论上有什么问题吗?
感谢。
答案 0 :(得分:1)
在以下声明中:
argv[k+1] = fileList[k]->text().toUtf8();
此表达式返回的QByteArray()
:
fileList[k]->text().toUtf8()
是一个在语句结束时被销毁的临时文件。因此,您存储在argv[]
数组中的指针立即无效。
也许尝试类似的事情:
argv[k+1] = qstrdup(fileList[k]->text().toUtf8().constData());
如果您使用delete []
,请务必在这些指针上调用qstrdup()
。