web-dev-qa-db-fra.com

ne peut pas convertir 'std :: basic_string <char>' en 'const char *' pour l'argument '1' en 'int system (const char *)'

J'obtiens cette erreur: "opérandes invalides des types 'const char *' et 'const char [6]' en binaire 'operator +'" quand j'essaye de compiler mon script. Voici l'erreur:

string name = "john";
system(" quickscan.exe resolution 300 selectscanner jpg showui showprogress filename '"+name+".jpg'");
21
Giacomo Cerquone

Le type d'expression

" quickscan.exe resolution 300 selectscanner jpg showui showprogress filename '"+name+".jpg'"

est std::string. Cependant le système de fonction a une déclaration

int system(const char *s);

c'est-à-dire qu'il accepte un argumentaire de type const char *

Aucun opérateur de conversion ne convertirait implicitement un objet de type std::string En objet de type const char *.

Néanmoins, la classe std::string A deux fonctions qui effectuent cette conversion explicitement. Ce sont c_str() et data() (le dernier ne peut être utilisé qu'avec un compilateur qui prend en charge C++ 11)

Vous pouvez donc écrire

string name = "john";

system( (" quickscan.exe resolution 300 selectscanner jpg showui showprogress filename '"+name+".jpg'").c_str() );

Il n'est pas nécessaire d'utiliser une variable intermédiaire pour l'expression.

42
Vlad from Moscow

std::string + const char* entraîne un autre std::string. system ne prend pas de std::string, et vous ne pouvez pas concaténer char* est avec le + opérateur. Si vous souhaitez utiliser le code de cette façon, vous aurez besoin de:

std::string name = "john";
std::string tmp = 
    "quickscan.exe resolution 300 selectscanner jpg showui showprogress filename '" + 
    name + ".jpg'";
system(tmp.c_str());

Voir opérateur std :: string + (const char *)

10
Ed S.

Comme le montrent toutes les autres réponses, le problème est que l'ajout d'un std::string Et d'un const char* En utilisant + Donne un std::string, Tandis que system() attend un const char*. Et la solution est d'utiliser c_str(). Cependant, vous pouvez également le faire sans temporaire:

string name = "john";
system((" quickscan.exe resolution 300 selectscanner jpg showui showprogress filename '"+name+".jpg'").c_str());
3
Angew

L'ajout d'un littéral de chaîne avec un std::string Produit un autre std::string. system attend un const char*. Vous pouvez utiliser std::string::c_str() pour cela:

string name = "john";
string tmp = " quickscan.exe resolution 300 selectscanner jpg showui showprogress filename '"+name+".jpg'"
system(tmp.c_str());
3
juanchopanza

La fonction système nécessite const char *, et votre expression est du type std::string. Tu devrais écrire

string name = "john";
string system_str = " quickscan.exe resolution 300 selectscanner jpg showui showprogress filename '"+name+".jpg'";
system(system_str.c_str ());
1
Alex Telishev