Skoro już spojrzał strtok
tylko nadal w dół tą samą drogą i podzielić ciąg używając przestrzeni (' '
) jako ogranicznik, a następnie użyć coś jak realloc
aby zwiększyć rozmiar tablicy zawierającej elementy mają być przekazane do execvp
.
Zobacz poniższy przykład, ale należy pamiętać, że strtok
będzie zmodyfikować ciąg przekazany do niego. Jeśli nie chcesz, aby tak się stało, musisz wykonać kopię oryginalnego ciągu znaków, używając strcpy
lub podobnej funkcji.
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)
Jeśli chcesz podzielić na podstawie spacji, dlaczego określono ';' jako ogranicznik? –
Na przykład: String = "ls -l; data SET + v" – Jordan