Découpage d'une ligne

Afin de gagner du temps, je vous propose ici une fonction prête à l'emploi pour découper une ligne en mots. Libre à vous de l'utiliser ou de programmer la votre.

Définition de decoupe

On propose une fonction decoupe permettant de découper une ligne en mots:


Voici le texte de decoupe:

char ligne[4096];

#include <ctype.h>

#define MAXELEMS 32
char* elems[MAXELEMS];

void decoupe()
{
  char* debut = ligne;
  int i;
  for (i=0; i<MAXELEMS-1; i++) {

    /* saute les espaces */
    while (*debut && isspace(*debut)) debut++;

    /* fin de ligne ? */
    if (!*debut) break;

    /* on se souvient du début de ce mot */
    elems[i] = debut;

    /* cherche la fin du mot */
    while (*debut && !isspace(*debut)) debut++; /* saute le mot */

    /* termine le mot par un \0 et passe au suivant */
    if (*debut) { *debut = 0; debut++; }
  }

  elems[i] = NULL;
}

Explication

Lors de son parcours de ligne, la fonction decoupe transforme les espaces et retours à la ligne (voir isspace(3)) en fin de mots en caractère \0 et fait pointer elems à l'intérieur de ligne. L'avantage de cette méthode est qu'il n'est pas nécessaire d'allouer de la mémoire supplémentaire pour stocker les mots isolés de ligne.

Exemple

Supposons que, avant l'appel à decoupe, ligne contienne la ligne ls -l /bin:

Au retour de decoupe, on aura alors:

Ainsi, elems[0] représente la chaîne ls, elems[1] la chaîne -l et elems[2] la chaîne /bin. Toutes ces chaînes sont bien terminées par le caractère \0.


Antoine Miné