Aller au contenu

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


AlexMog
 Share

Recommended Posts

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
Lien vers le commentaire
Partager sur d’autres sites

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é ^^

Lien vers le commentaire
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invité
Répondre à ce sujet…

×   Vous avez collé du contenu avec mise en forme.   Supprimer la mise en forme

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Chargement
 Share

×
×
  • Créer...