web-dev-qa-db-fra.com

C - fractionner la chaîne en un tableau de chaînes

Je ne sais pas trop comment faire cela en C:

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

Comment pourrais-je procéder?

33
Jordan

Puisque vous avez déjà examiné strtok continuez simplement sur le même chemin et divisez votre chaîne en utilisant l'espace (' ') comme délimiteur, puis utilisez quelque chose comme realloc pour augmenter la taille du tableau contenant les éléments à passer à execvp.

Voir l'exemple ci-dessous, mais gardez à l'esprit que strtok modifiera 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 d'origine, 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)
56

Voici un exemple d'utilisation de strtok emprunté à MSDN.

Et les bits pertinents, vous devez l'appeler plusieurs fois. Le token char * est la partie que vous insérez dans un tableau (vous pouvez comprendre 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 );
    }
}
6
Chris O