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:
-
L'entrée de decoupe est la chaîne à découper, contenue dans la
variable globale ligne.
-
La sortie de decoupe sera une liste de pointeurs vers le début
de chaque mot. La liste est stockée dans le tableau global elems
de MAXELEMS pointeurs et est terminée par le pointeur NULL.
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é