Votre avis sur une fonction de split...

cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 - 29 mars 2007 à 23:30
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 - 30 mars 2007 à 21:05
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

turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
30 mars 2007 à 10:01
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
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
30 mars 2007 à 16:58
En C,
la fonction strtok est faite pour ça.
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
30 mars 2007 à 21:05
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...
0
Rejoignez-nous