2013-03-01 4 views
-1

J'ai un programme qui utilise à Wichí utiliser getOpenFileName comme:Comment utiliser QString et « »

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 est un objet d'une classe qui envoient des tâches au travail SCILAB.it programme comme:

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');"); 

bien ceci fonctionne très bien, mais quand je l'utilise comme QString:

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

rien ne fonctionne, je pense à cause du // que je dois utiliser dans sprintf. Une idée comment puis-je résoudre ceci?

+0

Dans un littéral _string_, il n'est pas nécessaire d'échapper le caractère de guillemets simples '' '. –

+0

Qu'advient-il de text1 dans le second exemple, et 70 caractères suffisent-ils? Pourquoi n'utilisez-vous pas un std :: string ou un vecteur au lieu d'un tableau char? Comment fonctionne SendScilabJob - est-ce votre propre code utilisant QProcess? – Pete

+0

@Pete Je veux déjà faire cela mais SCILAjobs ne prend que char [], oui mon code utilise QProcess mais pourquoi ça marche dans la première partie '?? – Engine

Répondre

1

@borisbn a presque certainement trouvé le problème. sprintf est une fonction C, pas C++, et elle n'est pas du tout sécurisée. Il suppose que vous savez quels types à transmettre. Et pour %s, c'est const char*.

La solution simple: Ne pas utiliser sprintf. Vous avez une bonne classe C++, QString. Par exemple. QString text = QString("disp(fn=\'%1\');").arg(getPathloc()). Notez que vous n'utilisez pas %s. Comme c'est du C++, c'est un type de sécurité, et le compilateur déterminera si vous passez un entier ou une chaîne.