Aller au contenu

[Fonction utilitaire] explode (ouioui, comme en php ;))


Recommended Posts

Posté(e)

Bonjour à tous,

Je vais vous fournir une fonction "explode" qui vous permettra de découper une chaine de caractères grâce à un délimiteur.

 

I - Manuel de "explode":

NOM:

explode - découpage de chaine de caractères.

 

SYNOPSYS:

char **explode(char *chaine, char *delimiteur);

 

DESCRIPTION:

La fonction explode vous permettera de découper la chaine "chaine" grâce au délimiteur "delimiteur". Plusieurs délimiteurs peuvent être utilisés en les mettant l'un à côté de l'autre (ex: " \t.,") ou un mot complet (ex: "coucou").

Attention: la chaine "chaine" sera modifiée après l'utilisation de explode. Si vous souhaitez la garder, pensez à la stocker! (ex: strdump).

 

VALEUR RENVOYÉE:

La fonction explode renverra un tableau de chaines de caractères contenant, dans chacune des cases, une des itérations trouvées.

Si aucune itérations n'a été trouvée, explode renverra une version dumpée de la chaine chaine.

Si une erreur survient, explode renverra NULL.

 

VOIR AUSSI:

strtok(3)

 

COPYRIGHT:

La fonction explode a été crée par AlexMog ainsi que cette page de manuel.

 

II - Le code:

/*
** Code created by AlexMog
** Created the 10/04/2014 at 05:42pm.
** Last update by AlexMog the 10/04/2014 at 05:56pm.
** Please, leave the copyright.
*/
#include <string.h>

char **explode(char *chaine, char *delimiter)
{
	char **ret;
	char *word;
	int size;
	
	ret = NULL;
	word = strtok(chaine, delimiter);
	size = 0;
	while (word != NULL)
	{
		ret = realloc(ret, (size + 2) * sizeof(char*));
		if (ret == NULL)
			return (NULL);
		strcpy(ret[size], word);
		word = strtok(NULL, delimiter);
		++size;
	}
	if (ret != NULL)
		ret[size] = NULL;
	return (ret);
}

J'espère que vous ferrez bon usage de ce code :).

 

N'hésitez pas à me faire vos retours en cas de bugs.

 

Enjoy programming ;)

 

Cordialement,

AlexMog.

  • Upvote 1
Posté(e)

Voici:

/*
** Code created by AlexMog
** Created the 10/04/2014 at 05:42pm.
** Last update by AlexMog the 10/04/2014 at 05:56pm.
** Please, leave the copyright.
*/
#include <string.h>

char **explode(char *chaine, char *delimiter)
{
	// Variable de retours
	char **ret;
	// Variable pour écupérer un mot
	char *word;
	// Taille totale des mots lus
	int size;
	
	// On initialise les variables (pour éviter tout conflits et valeurs aléatoires)
	ret = NULL;
	// On stoque le premier mot trouvé avant le délimiteur (voir man strtok)
	word = strtok(chaine, delimiter);
	size = 0;
	// Début de la boucle, tant qu'on a un mot, on continue (je n'ai pas mis de doWhile à cause du 2nd argument de strtok qui doit être mis à NULL (lire le man de strtok)
	while (word != NULL)
	{
		// On alloue la place naisséssaire en mémoire pour stocker (size + 2) cases (donc, on ajoute une nouvelle case dans notre tableau à chaque tour de boucle (c'est ce qu'on appelle un tableau dynamique, je ferais un cours dessus)
		ret = realloc(ret, (size + 2) * sizeof(char*));
		// D'après le man de realloc, celui-ci retourne NULL en cas d'erreur, je vérifie donc qu'il n'y a eu aucune erreur
		if (ret == NULL)
			return (NULL);
		// Je copie le contenue de "word" (donc du mot trouvé) dans la case actuelle du tableau
		strcpy(ret[size], word);
		// Je récupère le prochain mot
		word = strtok(NULL, delimiter);
		// J'incrémente la taille du tableau
		++size;
	}
	// Je vérifie si ret est NULL
	if (ret != NULL)
		// Si il ne l'est pas, c'est que le tableau a été remplis , j'ajoute donc un NULL à la dernière case du tableau, pour définir la fin de celui-ci
		// (Ce qui explique le size + 2 au niveau du realloc 
		ret[size] = NULL;
	// Enfin, on renvois le tableau alloué (ne pas oublier de le free après utilisation )
	return (ret);
}

J'espère avoir assez bien expliqué ^^

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...