Accueil > > > SPLIT/EXPLODE D'UNE CHAINE DE CARACTERE EN C
SPLIT/EXPLODE D'UNE CHAINE DE CARACTERE EN C
Information sur la source
Description
Suite à la question que j'ai posé sur le forum, j'ai fait une petite fonction qui découpe une chaine suivant un délimiteur. La fonction permet de choisir si on accpete ou non les mots vides. Elle retourne un tableau de chaines de caractères, terminé par NULL. Le code est compilé sous windows avec gcc donc la fonction doit être portable sous linux/unix. (quoique que j'ai des doutes sur system("pause") )
Source
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- // Retour tableau des chaines recupérer. Terminé par NULL.
- // chaine : chaine à splitter
- // delim : delimiteur qui sert à la decoupe
- // vide : 0 : on n'accepte pas les chaines vides
- // 1 : on accepte les chaines vides
- char** split(char* chaine,const char* delim,int vide){
-
- char** tab=NULL; //tableau de chaine, tableau resultat
- char *ptr; //pointeur sur une partie de
- int sizeStr; //taille de la chaine à recupérer
- int sizeTab=0; //taille du tableau de chaine
- char* largestring; //chaine à traiter
-
- int sizeDelim=strlen(delim); //taille du delimiteur
-
-
- largestring = chaine; //comme ca on ne modifie pas le pointeur d'origine
- //(faut ke je verifie si c bien nécessaire)
-
-
- while( (ptr=strstr(largestring, delim))!=NULL ){
- sizeStr=ptr-largestring;
-
- //si la chaine trouvé n'est pas vide ou si on accepte les chaine vide
- if(vide==1 || sizeStr!=0){
- //on alloue une case en plus au tableau de chaines
- sizeTab++;
- tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
-
- //on alloue la chaine du tableau
- tab[sizeTab-1]=(char*) malloc( sizeof(char)*(sizeStr+1) );
- strncpy(tab[sizeTab-1],largestring,sizeStr);
- tab[sizeTab-1][sizeStr]='\0';
- }
-
- //on decale le pointeur largestring pour continuer la boucle apres le premier elément traiter
- ptr=ptr+sizeDelim;
- largestring=ptr;
- }
-
- //si la chaine n'est pas vide, on recupere le dernier "morceau"
- if(strlen(largestring)!=0){
- sizeStr=strlen(largestring);
- sizeTab++;
- tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
- tab[sizeTab-1]=(char*) malloc( sizeof(char)*(sizeStr+1) );
- strncpy(tab[sizeTab-1],largestring,sizeStr);
- tab[sizeTab-1][sizeStr]='\0';
- }
- else if(vide==1){ //si on fini sur un delimiteur et si on accepte les mots vides,on ajoute un mot vide
- sizeTab++;
- tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
- tab[sizeTab-1]=(char*) malloc( sizeof(char)*1 );
- tab[sizeTab-1][0]='\0';
-
- }
-
- //on ajoute une case à null pour finir le tableau
- sizeTab++;
- tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
- tab[sizeTab-1]=NULL;
-
- return tab;
- }
-
- int main(){
- int i;
- int ret;
- char* str="foo|bar||baz|bar|";
- char** tab;
-
- printf("Chaine initiale : %s \n",str);
-
- tab=split(str,"|",0);
- //affichage du resultat
- for(i=0;tab[i]!=NULL;i++) {
- printf("%d : %s\n",i,tab[i]);
- //au passge je désalloue les chaines
- free(tab[i]);
- }
- free(tab);
-
- printf("\n");
-
- tab=split(str,"|",1);
- //affichage du resultat
- for(i=0;tab[i]!=NULL;i++) {
- printf("%d : %s\n",i,tab[i]);
- //au passge je désalloue les chaines
- free(tab[i]);
- }
- free(tab);
-
- system("pause");
-
- }
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Retour tableau des chaines recupérer. Terminé par NULL.
// chaine : chaine à splitter
// delim : delimiteur qui sert à la decoupe
// vide : 0 : on n'accepte pas les chaines vides
// 1 : on accepte les chaines vides
char** split(char* chaine,const char* delim,int vide){
char** tab=NULL; //tableau de chaine, tableau resultat
char *ptr; //pointeur sur une partie de
int sizeStr; //taille de la chaine à recupérer
int sizeTab=0; //taille du tableau de chaine
char* largestring; //chaine à traiter
int sizeDelim=strlen(delim); //taille du delimiteur
largestring = chaine; //comme ca on ne modifie pas le pointeur d'origine
//(faut ke je verifie si c bien nécessaire)
while( (ptr=strstr(largestring, delim))!=NULL ){
sizeStr=ptr-largestring;
//si la chaine trouvé n'est pas vide ou si on accepte les chaine vide
if(vide==1 || sizeStr!=0){
//on alloue une case en plus au tableau de chaines
sizeTab++;
tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
//on alloue la chaine du tableau
tab[sizeTab-1]=(char*) malloc( sizeof(char)*(sizeStr+1) );
strncpy(tab[sizeTab-1],largestring,sizeStr);
tab[sizeTab-1][sizeStr]='\0';
}
//on decale le pointeur largestring pour continuer la boucle apres le premier elément traiter
ptr=ptr+sizeDelim;
largestring=ptr;
}
//si la chaine n'est pas vide, on recupere le dernier "morceau"
if(strlen(largestring)!=0){
sizeStr=strlen(largestring);
sizeTab++;
tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
tab[sizeTab-1]=(char*) malloc( sizeof(char)*(sizeStr+1) );
strncpy(tab[sizeTab-1],largestring,sizeStr);
tab[sizeTab-1][sizeStr]='\0';
}
else if(vide==1){ //si on fini sur un delimiteur et si on accepte les mots vides,on ajoute un mot vide
sizeTab++;
tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
tab[sizeTab-1]=(char*) malloc( sizeof(char)*1 );
tab[sizeTab-1][0]='\0';
}
//on ajoute une case à null pour finir le tableau
sizeTab++;
tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
tab[sizeTab-1]=NULL;
return tab;
}
int main(){
int i;
int ret;
char* str="foo|bar||baz|bar|";
char** tab;
printf("Chaine initiale : %s \n",str);
tab=split(str,"|",0);
//affichage du resultat
for(i=0;tab[i]!=NULL;i++) {
printf("%d : %s\n",i,tab[i]);
//au passge je désalloue les chaines
free(tab[i]);
}
free(tab);
printf("\n");
tab=split(str,"|",1);
//affichage du resultat
for(i=0;tab[i]!=NULL;i++) {
printf("%d : %s\n",i,tab[i]);
//au passge je désalloue les chaines
free(tab[i]);
}
free(tab);
system("pause");
}
Conclusion
Le tableau est alloué dynamiquement => n'oubliez pas de désallouer.
Merci à buno et steve_clamage pour leur info sur le forum.
Puis si vous trouver des bug ou si vous voulez noter, un chtit commentaire.
Voila a quoi ressemble la sortie : chaine init : foo|bar||baz|bar| 0 : foo 1 : bar 2 : baz 3 : bar
0 : foo 1 : bar 2 : 3 : baz 4 : bar 5 : Appuyez sur une touche pour continuer...
Historique
- 17 août 2005 14:31:40 :
- - Rajout d'un zip pour ceux que ca interresse
- Exemple de sortie du programme, pour voir ce que ca fait concrètement
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
split/explode d'une chaine [ par goth ]
bonjour tt le monde, je cherche une fonction qui ferait a peu pres la même chose que explode en php, a savoir decouper une chaine suivant u
[FUNCTION] : Problème de déclaration [ par Alex120 ]
Bonjour, J'ai écrit une fonction split() dans un fichier cpp : #include <clx.h> #include "vector.h" /** * FUNCTION SPLIT() */ vo
Traiter une chaine en c++ [ par drnicholas001 ]
Salut, je veux me faire un petit programme qui fonctionne en ligne de commande, donc lutilisateur écrit en mode console : solve(x-2=0, x) et le p
Recuper une chaine contenu dans un string [ par clcat ]
Bonjour a tous,Le probleme est simple je pense (je programme en C++) :j'ai cette ligne la : node = insDoc(aux1, gLnk("<FONT class='FTFONT'>GPFD&
probleme d'une chaine de caracteres [ par bilaloch ]
Bonjour a tous,J'ai un ptit probleme au niveau d'une manipulation sur une chaine de caracteres. Voici le code : std::string *position = <FONT color=#
Split de chaine de caracteres [ par lektrosonic ]
Existe-il une fonction predefinie qui transforme char[ ]="ceci|est|une|chaine|separee/0" en char1[]="ceci", char2[]="est" .... ?l3KTr0 Was HeRe
C string compare [ par Yunchi ]
Bonjour, Je recherche une fonction dans le bibliotheque string.h ou autre qui permettrait en fait de savoir si une chaine est presente dans une autre
explode [ par thebigbang ]
bonjour à tous,Je cherche une fonction C++ qui permettrait de créer des tableaux de chaine à partir d'une autre chaine que l'on aurait découpée en fon
explode [ par thebigbang ]
bonjour à tous,Je cherche une fonction C++ qui permettrait de créer des tableaux de chaine à partir d'une autre chaine que l'on aurait découpée en fon
Convertion d'une string en char [ par redpooka ]
Voici avec ce programme ca n'affiche juste le premier charactère comment faire pour qu'il affiche toute la chaine de caracètre ?Merci#include <iost
|
Derniers Blogs
TECHDAYS PARIS 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYSTECHDAYS PARIS 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYS par ROMELARD Fabrice
Speakers : Lionel Limozin et Alain Marty La session commence par une découverte de SharePoint à travers la mise en place d'un environnement SharePoint pour la gestion des Sessions animées par BeWise. Le besoin est très ba...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice PERSPECTIVE 3.0 POUR SILVERLIGHT 5.0PERSPECTIVE 3.0 POUR SILVERLIGHT 5.0 par odewit
Je viens de publier la version 3.0 de Perspective pour Silverlight, qui regroupe un portage sous Silverlight 5.0 des fonctionnalités de Perspective 2.0, le framework 3D de haut-niveau introduit récemment et de nouveaux exemples de code. En voici la li...
Cliquez pour lire la suite de l'article par odewit TECHDAYS PARIS 2012 : TOP 10 DES BEST PRACTICES POUR SQL SERVERTECHDAYS PARIS 2012 : TOP 10 DES BEST PRACTICES POUR SQL SERVER par ROMELARD Fabrice
Speaker : Nadia Ben El Kadi Configuration machine La session commence par la toute première question à se poser lors de la mise en place d'environnement SQL Server, la configuration des machines : Type de mac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : KINECT + OFFICE 365 UN BON GESTE POUR VOTRE SITECHDAYS PARIS 2012 : KINECT + OFFICE 365 UN BON GESTE POUR VOTRE SI par ROMELARD Fabrice
Speakers : Fabrice Barbin, Samuel Blanchard, Julien Lo Presti Titre Prometteur et attractif invitant à voir comment lier le composant ludique Kinect dans le cadre d'une structure IT classique, notamment au travers de la plat...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE DU PREMIER JOURTECHDAYS PARIS 2012 : PLEINIèRE DU PREMIER JOUR par ROMELARD Fabrice
KeyNotes du premier jour pour les développeurs. La session est principalement axée sur une des principales directions prise par Microsoft à travers tous ses nouveaux produits : Cloud privé ou public (Solution Azure) ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : C++ RE : C++ par louis14
Cliquez pour lire la suite par louis14 C++ C++ par yesoun1
Cliquez pour lire la suite par yesoun1
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|