2012-06-25 2 views
31

Je ne suis pas tout à fait sûr de savoir comment faire dans C:C - Scinde une chaîne en un tableau de chaînes

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

Comment dois-je prendre?

+4

Si vous souhaitez diviser en fonction des espaces, pourquoi avez-vous spécifié ';' comme délimiteur? –

+2

Par exemple: string = "ls -l; date; set + v" – Jordan

Répondre

49

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

@JordanCarney heureux d'être de service. –

+0

@ FilipRoséen-refp Pouvez-vous expliquer le dernier bloc de code avant l'impression et la libération de la mémoire, le: '/ * realloc un élément supplémentaire pour la dernière NULL * /'? J'ai de la difficulté à le comprendre – Abdul

+0

@Abdul Je crois habituellement qu'il y a un caractère nul à la fin de chaque tableau afin que l'ordinateur puisse différencier deux tableaux différents. – Charles

6

Here is an example of how to use strtok de MSDN empruntèrent.

Et les bits pertinents, vous devez l'appeler plusieurs fois. Le token char * est la partie que vous voulez insérer dans un tableau (vous pouvez trouver cette partie).

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

Je comprends beaucoup, mais cela ne me donne pas un tableau de chaînes de jetons. Je suppose que je ne comprends pas cette partie spécifique. – Jordan

+0

Pourquoi 'token = strtok (NULL, seps);'? Pourquoi le 'NULL'? – Charles

+0

@ c650 Voir la page liée de MSDN, les appels ultérieurs ont besoin de 'NULL'. –

Questions connexes