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
L'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIESL'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIES par odewit
La tendance est aux interfaces naturelles (NUI), et le keynote de Bill Buxton au MIX l'a bien souligné.
La charte graphique et ergonomique de Windows Phone 7 a donc été entièrement repensée en vue d'obtenir un maximum d'efficacité sur ce point. En re...
Cliquez pour lire la suite de l'article par odewit COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|