2012-06-25 33 views
31

no estoy completamente seguro de cómo hacer esto en C:C - Separar una cadena en una matriz de cadenas

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

¿Cómo voy a ir haciendo esto?

+4

Si desea dividir en función de espacios, ¿por qué ha especificado ';' como delimitador? –

+2

Por ejemplo: string = "ls -l; date; set + v" – Jordan

Respuesta

49

Como ya ha mirado en strtok simplemente seguir por el mismo camino y dividir su cadena utilizando el espacio (' ') como delimitador, a continuación, utilizar algo tan realloc para aumentar el tamaño de la matriz que contiene los elementos que se han pasado a execvp.

Vea el siguiente ejemplo, pero tenga en cuenta que strtok modificará la cadena que se le pasa. Si no desea que esto suceda, debe hacer una copia de la cadena original, usando strcpy o una función similar.

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 contentos de estar a su servicio. –

+0

@ FilipRoséen-refp ¿Puede explicar el último bloque de código antes de imprimir y liberar la memoria, el: '/ * realloc un elemento adicional para el último NULL * /'? Tengo dificultades para entenderlo – Abdul

+0

@Abdul Creo que generalmente hay un carácter nulo al final de cada matriz para que la computadora pueda diferenciar entre dos matrices diferentes. – Charles

6

Here is an example of how to use strtok tomados de MSDN.

Y los bits relevantes, necesita llamarlo varias veces. El token char * es la parte que incluirías en una matriz (puedes calcular esa parte).

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

Entiendo esto mucho, pero esto no me da una variedad de cadenas de los tokens. Supongo que no entiendo esa parte específica de eso. – Jordan

+0

¿Por qué 'token = strtok (NULL, seps);'? ¿Por qué el 'NULL'? – Charles

+0

@ c650 Consulte la página enlazada desde MSDN, las llamadas subsiguientes necesitan 'NULL'. –

Cuestiones relacionadas