Votre avis sur une fonction de split...

Signaler
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010
-
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010
-
Bonsoir,

Je dois faire une fonction de "splitage" de chaine. J'ai realisé ce bout de code et j'aimerais votre avis. La fonction n'est pas tout a fait finie mais je voudrais savoir si je peux continuer sur cette fonction.

#include <stdio.h>
#include <stdlib.h>

static const size_t sizestr = 256;
static size_t champ = 0;

int mysplit_free(char **tab)
{
  for(int i = 0; i < champ; i++)
  {
    free(tab[i]);
    tab[i] = NULL;
  }

  free(tab);

  tab = NULL;

  return 0;
}

char** mysplit(char *chaine, char sep)
{
  char *c = NULL;
  char **temp = NULL;
  char **old = NULL;
  size_t index = 0;

  /* test chaine vide */
  if(chaine == 0)
    return NULL;

  /* on parcourt la chaine */
  c = chaine;

  /* allocation memoire pour la premiere chaine */
  temp = (char**)malloc((champ + 1) * sizeof(char*));
  if(temp == NULL)
    return NULL;

  temp[champ] = (char*)malloc(sizestr * sizeof(char));
  if(temp[champ] == NULL)
  {
    free(temp);
    return NULL;
  }

  temp[champ][0] = 0;

  /* sauvegarde du pointeur */
  old = temp;

  /* tant qu'on est pas en fin de chaine */
  while(*c != 0)
  {
    /* c'est le separatif */
    if(*c == sep)
    {
      /* on termine la chaine */
      temp[champ][index] = 0;
      index = 0;
      champ++;

      /* re-allocation memoire pour une chaine en plus */
      temp = (char**)realloc(temp, (champ + 1) * sizeof(char*));
      if(temp == NULL)
      {
        mysplit_free(old);
        return NULL;
      }

      temp[champ] = (char*)malloc(sizestr * sizeof(char));
      if(temp[champ] == NULL)
      {
        champ--;
        mysplit_free(temp);
        return NULL;
      }
      temp[champ][0] = 0;

      /* sauvegarde du pointeur */
      old = temp;
    }
    else
      temp[champ][index++] = *c;

    c++;
  }

  /* dernier champs */
  temp[champ++][index] = 0;

  /* fin de chaine */
  temp = (char**)realloc(temp, (champ + 1) * sizeof(char*));
  if(temp == NULL)
  {
    mysplit_free(old);
    return NULL;
  }
  temp[champ] = NULL;

  return temp;
}

int main()
{
  char *toto = "hello;my;name;is;bond;james;bond";
  char **retour = NULL;

  retour = mysplit(toto, ';');

  while(*retour)
    puts(*retour++);

  mysplit_free(retour);
}

merci pour vos réponses,

Matt...

3 réponses

Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
include

#include

// découpe la chaine selon les séparateurs donnés

void
split( const std::string & Msg, const std::string & Separators )
{
// typedef pour alléger l'écriture
typedef boost::tokenizerchar> > my_tok;

// séparateur personnalisé
boost::char_separator<char> sep( Separators.c_str() );

// construire le tokenizer personnalisé
my_tok tok( Msg, sep );

// itérer la séquence de tokens
for ( my_tok::const_iterator i = tok.begin();
i != tok.end();
++i )
{
// afficher chaque token extrait
std::cout << *i << '\n';
}
}

int main()
{
split( "mot-compose1;mot,compose2;[mot][compose3];mot compose4;<mot><compose><5>", ";" );
}





Ce programme produit le résultat suivant :






mot-compose1
mot,compose2
[mot][compose3]
mot compose4
<mot><compose><5>







<hr size="2" width="100%" />TuRn3r
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
En C,
la fonction strtok est faite pour ça.
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

Bonsoir,

Merci pour vos réponses.

turnerom : une contrainte (qui n'en est pas une d'ailleurs), ca doit être du C.

yann_lo_san : La fonction strtok ne me suffit pas car je dois faire autre chose que de splitter ma chaine
comme quand je rencontre ' ou ", je dois mettre un \ devant ou encore, il faut que je limite la taille de mes champs et
d'autre chose encore.

C'etait plutot un avis sur la façon de faire qui m'interresse.
Car s'il y a des choses qui ne vont pas du tout, autant modifier maintenant et continuer sur "de bases saines".

Bonne soirée,

Matt...