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
Répondre
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)
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
Salut! S'il vous plaît voir [demander] et comment créer un [mcve]. Qu'avez-vous essayé jusqu'à présent? – msanford
Convertissez-le en un vecteur de 'char const *', et utilisez 'execv' à la place. –