2012-06-25 9 views
31

io non sono del tutto sicuro di come fare questo in C:C - stringa suddivisa in un array di stringhe

char* curToken = strtok(string, ";"); 
//curToken = "ls -l" we will say 
//I need a array of strings containing "ls", "-l", and NULL for execvp() 

Come potrei fare per fare questo?

+4

Se si desidera dividere in base agli spazi, perché è stato specificato ';' come delimitatore? –

+2

Ad esempio: string = "ls -l; date; set + v" – Jordan

risposta

49

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) 
+1

@JordanCarney felice di essere al servizio. –

+0

@ FilipRoséen-refp Puoi spiegare l'ultimo blocco di codice prima della stampa e liberare la memoria, il:// realloc un elemento in più per l'ultimo NULL */'? Ho difficoltà a comprenderlo – Abdul

+0

@Abdul Credo che di solito ci sia un carattere null alla fine di ogni array in modo che il computer possa distinguere tra due diversi array. – Charles

6

Here is an example of how to use strtok preso in prestito da MSDN.

E i bit rilevanti, è necessario chiamarlo più volte. Il char * token è la parte che inseriresti in un array (puoi capirlo).

char string[] = "A string\tof ,,tokens\nand some more tokens"; 
char seps[] = " ,\t\n"; 
char *token; 

int main(void) 
{ 
    printf("Tokens:\n"); 
    /* Establish string and get the first token: */ 
    token = strtok(string, seps); 
    while(token != NULL) 
    { 
     /* While there are tokens in "string" */ 
     printf(" %s\n", token); 
     /* Get next token: */ 
     token = strtok(NULL, seps); 
    } 
} 
+0

Capisco molto, ma questo non mi dà una serie di stringhe dai token. Immagino di non capire quella parte specifica di esso. – Jordan

+0

Perché 'token = strtok (NULL, seps);'? Perché il 'NULL'? – Charles

+0

@ c650 Vedere la pagina collegata da MSDN, le chiamate successive necessitano di 'NULL'. –