Dal momento che avete già esaminato strtok
solo continuare sulla stessa strada e dividere la stringa utilizzando lo spazio (' '
) come delimitatore, quindi usare qualcosa come realloc
per aumentare la dimensione della matrice contenente gli elementi da passare al execvp
.
Vedere l'esempio di seguito, ma tenere presente che strtok
modificherà la stringa passata. Se non si desidera che ciò accada, è necessario eseguire una copia della stringa originale, utilizzando la funzione strcpy
o simile.
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)
fonte
2012-06-25 23:03:21
Se si desidera dividere in base agli spazi, perché è stato specificato ';' come delimitatore? –
Ad esempio: string = "ls -l; date; set + v" – Jordan