Puisque vous avez déjà regardé dans strtok
juste continuer sur le même chemin et diviser votre chaîne en utilisant l'espace (' '
) comme séparateur, utilisez quelque chose comme realloc
pour augmenter la taille du tableau contenant les éléments à transmettre à execvp
.
Voir l'exemple ci-dessous, mais gardez à l'esprit que strtok
va modifier la chaîne qui lui est passée. Si vous ne voulez pas que cela se produise, vous devez faire une copie de la chaîne originale, en utilisant strcpy
ou une fonction similaire.
char str[]= "ls -l";
char ** res = NULL;
char * p = strtok (str, " ");
int n_spaces = 0, i;
/* split string and append tokens to 'res' */
while (p) {
res = realloc (res, sizeof (char*) * ++n_spaces);
if (res == NULL)
exit (-1); /* memory allocation failed */
res[n_spaces-1] = p;
p = strtok (NULL, " ");
}
/* realloc one extra element for the last NULL */
res = realloc (res, sizeof (char*) * (n_spaces+1));
res[n_spaces] = 0;
/* print the result */
for (i = 0; i < (n_spaces+1); ++i)
printf ("res[%d] = %s\n", i, res[i]);
/* free the memory allocated */
free (res);
res[0] = ls
res[1] = -l
res[2] = (null)
Si vous souhaitez diviser en fonction des espaces, pourquoi avez-vous spécifié ';' comme délimiteur? –
Par exemple: string = "ls -l; date; set + v" – Jordan