2017-09-05 1 views
-3

J'ai (tous les std) un vector<string> que je voudrais pousser dans execl, de sorte que chaque membre de mon vecteur est passé comme char*. Est-ce possible et si oui, comment l'atteindre?Vecteur dans varargs

+1

Salut! S'il vous plaît voir [demander] et comment créer un [mcve]. Qu'avez-vous essayé jusqu'à présent? – msanford

+0

Convertissez-le en un vecteur de 'char const *', et utilisez 'execv' à la place. –

Répondre

0

Non, ce n'est pas possible, mais vous pouvez utiliser execv à la place. execl prend une variable de longueur l ist d'arguments, tandis que execv prend un v ector (en réalité un tableau C). Vous devrez cependant convertir votre std::vector<std::string> en un tableau C de chaînes (char **). De même, execv requiert un tableau à terminaison nulle, c'est-à-dire que le dernier élément du tableau doit être un pointeur nul. Mais quelque chose comme cela devrait fonctionner:

int exec_my_vector(std::string path, std::vector<std::string> v) 
{ 
    const char *cv[v.size() + 1]; 
    unsigned i; 
    for(i = 0; i < v.size(); i++) 
     cv[i] = v[i].c_str(); 
    cv[i] = NULL; 
    return execv(path.c_str(), (char * const *)cv); 
} 

(Avertissement:. Il y a un casting hideux à la fin de l'appel execv qui ne devrait pas être nécessaire, mais je ne peux pas trouver un moyen autour d'elle)

+1

Ne vaut rien non plus que la conversion ne nécessite pas plus de stockage que le vecteur de pointeurs lui-même. Il peut être rempli en appelant 'c_str()' sur chaque élément du vecteur original. – StoryTeller