TABLEAUX DE CHAINES DE CARACTÈRE: FONCTIONS IMPLODE, EXPLODE ET COUNT

Signaler
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43723-tableaux-de-chaines-de-caractere-fonctions-implode-explode-et-count

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
21
if(strarr!=NULL && strarr[0]!=NULL)
Si strarr vaut 0, c'est badaboum garanti d'essayer de lire strarr[0].
Messages postés
1
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
19 décembre 2008

Merci pour ce source très utile.
Voici une autre version de la fonction implode() où le délimiteur est une chaine au lieu d'un char.

/**
* Rassemble les elements d'un tableau en une chaine en les concatenant avec le separateur
* @param strarr tableau de chaine
* @param separator separateur (peut etre une chaine vide)
* @return chaine concatenee ou NULL en cas d'erreur
*/

char * implode(const char **strarr, const char *separator)
{
char *res;
int taille_strarr,taille_sep;
int i;
const char *sep;

if(strarr!=NULL && strarr[0]!=NULL)
{
taille_strarr = sizeof(strarr);
res = (char *)malloc((strlen(strarr[0])+1)*sizeof(char));
sprintf(res,"%s",strarr[0]);
if(separator==NULL)
sep = "";
else
sep = separator;
taille_sep = strlen(sep);
for(i=1;i<taille_strarr;i++)
{
res = (char *)realloc(res,(strlen(res)+taille_sep+strlen(strarr[i])+1)*sizeof(char));
sprintf(res,"%s%s%s",res,separator,strarr[i]);
}
return res;
}
return NULL;
}
Messages postés
1
Date d'inscription
vendredi 11 avril 2003
Statut
Membre
Dernière intervention
23 février 2008

par contre quelques traitements d'erreur serait certanement bien venu en cas de dépassement de memoire ..

par ex : voici ce que j'ai fait en reprenant une partie de ce que tu avais fait..

int Explode(char* Txt, char**& return_value, char Separator /*= ';'*/)
{
if (Separator == '\0')
throw "Delimiter null";

int NumRows = 0;
char *Car = Txt;

// Calcul de la taille
while (Car != NULL) {
Car = strchr(++Car, Separator);
if (Car != NULL) { NumRows++; }
}

if (!NumRows) return 0; // Si pas de chaine a scindé , on sort.

NumRows++; //pour avoir le dernier "Mot" qui n'as pas de ';' en fin (en theorie)

Car = Txt; //Reinitialisation du pointeur

int lenWord = 0;
char *CarPtr = &(Txt[0]);
int i = 0;
int NumCar = 0;
int lenChar = strlen(&Separator); // toujours 1 mais au cas ou Separator != > char.

try {
return_value = new char * [NumRows]; //Allocation

// parcours a la recherche des chaines
while(i<NumRows) {
lenWord++;
if ((*Car == Separator) || (*Car==0)) {
return_value[i] = new char[lenWord];
strncpy(return_value[i], CarPtr, lenWord-lenChar);
CarPtr = &Txt[NumCar+lenChar];
lenWord = 0; //reinitialisation de la longueur de chaine
i++; //Element suivant dans le tableau
}
Car++; NumCar++;
};

} catch (...) {
delete [] return_value;
return 0;
}
return NumRows; // Renvoie du nombre de ligne;
}
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
Le délimiteur de ta fonction explode se limite à un seul caractère. Que penses-tu d'étendre celui-ci à une chaîne de caractères, voire à une expression régulière comme en perl ?
Afficher les 12 commentaires