2015-11-12 1 views
1

Je reçois la commande du clavier dans un vector<string> et je veux utiliser dans execl(), mais execl() prend un const char *. Y at-il une autre fonction similaire à execl je peux utiliser qui prend char* paramètres, ou comment puis-je appeler execl avec mon char*?Appel execl sur un caractère non-const []

void Process::exec(string & program, vector<string> & params){ 
int i; 
char x=program[0]; 
if(x=='/'){ 
    char * argq[params.size()]; 
     for(i=0;i<params.size();i++){ 
      argq[i]=(string_to_c_convert(params[i])); 
     } 

    if(params.size()==2){ 
     execl(argq[0],argq[0],(char *)0); 
    } 
    if(params.size()==3){ 
     execl(argq[0],argq[1],argq[2],(char *)0); 
    } 
} 
+1

Utilisez execv qui a été créé exactement pour cette raison? – immibis

+0

Je ne suis en aucun cas un expert, et fondamentalement juste cherché de la documentation (qui peut même ne pas être officielle), mais il _appears_ que ['execv' prend un' const char * '] (http://linux.die.net/man/3/execv) aussi bien. – Tas

+0

@Elle prend un pointeur vers un tableau d'entre eux. Ai-je bien compris que votre problème est que vous voulez pouvoir passer n'importe quel nombre de paramètres sans copier-coller du code (pour appeler 'execl' avec des nombres de paramètres différents)? – immibis

Répondre

0

Vous pouvez faire une std::string de votre char[] puis utilisez std::string::data() qui retourne un const char*:

char * argq[params.size()]; 
    for(i=0;i<params.size();i++){ 
     argq[i]=(string_to_c_convert(params[i])); 
    } 

const std::string args(argq); 
execl(args.data()[0], args.data()[1], 0); 

Voyant que vous avez déjà un std::vector<std::string>, où je suppose que chaque std::string est en fait un seul caractère (en fonction de votre fonction de boucle et string_to_c_convert), vous pouvez ignorer le char[] et effectuer les opérations suivantes:

execl(params[0].c_str(), params[1].c_str(), 0); 
2

const char * ne signifie pas que l'argument doit êtreconst, cela signifie qu'il peut être const.

Il n'y a pas de problème à résoudre.