2013-03-01 52 views
-1

我有使用wichI使用getOpenFileName像一個程序:如何使用QString和「」

QString fileName = QFileDialog::getOpenFileName(this, 
        tr("Select video"), "d:\\", tr("Video files (*.avi)")); 
strcpy(thePath, fileName.toStdString().c_str()); // static char thePath[66]; 
scilab.setPathloc(thePath); 

scilab是將作業發送到計劃SCILAB.it一個類的對象一樣工作:

char std_dev[99]; 
char direc[60]; 
sprintf(direc,"direc=\'d:/BMDvideos/%s/%s/\'",getSessionName(),getVideoname()); 
sprintf(std_dev,"fn=\'d:/BMDvideos/%s/%s/%s.avi\'", 
     getSessionName(),getVideoname(),getVideoname()); 
SendScilabJob(direc); 
SendScilabJob(std_dev); 
//SendScilabJob("fn=\'d:/BMDvideos/Aufnahme0.avi\'"); 
SendScilabJob("exec('U:/scilab/done/std_dev.sce');"); 

好這個工作正常,但是當我使用QString,如:

char text1 [70] ; 
sprintf(text1,"disp(fn=\'%s\');",getPathloc()); 
SendScilabJob("exec('U:/scilab/done/std_dev.sce');"); 

沒有任何作品,我認爲這是因爲我必須在sprintf中使用//。任何想法如何解決這個問題?

+0

在_String_字面你沒有逃跑的單引號字符'''。 – 2013-03-01 12:55:12

+0

第二個例子中的text1會發生什麼情況,並且有足夠的70個字符?爲什麼不使用std :: string或向量而不是char數組? SendScilabJob如何工作 - 這是你自己使用QProcess的代碼嗎? – Pete 2013-03-01 12:59:40

+0

@Pete我已經想這樣做,但SCILAjobs只拿的char [],是我的代碼使用QProcess中,但爲什麼它在第一部分的工作'? – Engine 2013-03-01 13:03:19

回答

1

@borisbn幾乎肯定發現了這個問題。 sprintf是C函數,而不是C++,它根本不是類型安全的。它假定你知道要傳遞哪些類型。而對於%s,那是const char*

簡單的解決辦法:不要使用sprintf。你有一個合適的C++類,QString。例如。 QString text = QString("disp(fn=\'%1\');").arg(getPathloc())。請注意,您不使用%s。由於它是C++,因此它是類型安全的,編譯器會計算出您是傳遞一個整數還是一個字符串。