begin process at 2012 05 30 19:41:08
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

votre avis sur une fonction de split...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

votre avis sur une fonction de split...

jeudi 29 mars 2007 à 23:30:11 | votre avis sur une fonction de split...

Matt67

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...
vendredi 30 mars 2007 à 10:01:20 | Re : votre avis sur une fonction de split...

turnerom

														
																include <iostream>
																
#include <boost/tokenizer.hpp>

// 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::tokenizer<boost::char_separator<char> > 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>



TuRn3r
vendredi 30 mars 2007 à 16:58:49 | Re : votre avis sur une fonction de split...

yann_lo_san

En C,
la fonction strtok est faite pour ça.

vendredi 30 mars 2007 à 21:05:13 | Re : votre avis sur une fonction de split...

Matt67

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...


Cette discussion est classée dans : chaine, champ, temp, char, free


Répondre à ce message

Sujets en rapport avec ce message

#def [ par xarier ] salut tous fje voudrait savoir un trucs sur les #defest ce que je peut faire un #def pour une fonction ex : un #def pour cachar* Replace( char* Chain Assosier 2 chaine de caractere PB :s [ par Booster ] Bonjour,Alors voila je veux tout simplement assosier 2 chaines de caractere mais jaimerais le faire sans passer par une variables intermediaire je m'e plantage avec free( ) !!! [ par ElectricalMan ] slt tt le monde,j'ai un beau plantage avec la fonction free !  donc si qq peut m'aider pck je tourne en rond.j'ai mis en bleu les parties concernées. petit problême de chaine [ par Cphil51 ] Je débute en C++ et j'ai un petit problême avec mon code. J'ai créé une fonction qui prend en argument une chaine et un entier et qui retourne les n p Ordre dans les déclarations de variables ??! [ par vincemail ] Bonjour à tous, je suis en train de faire un programme en C++ avec devC++, et je viens de trouver un bug que je n'arrive pas à comprendre, je veux sto Arbre Binaire. Probleme de concatenation [ par YnOThAr ] Bonjour tout le monde ! La fin de l'année arrive et avec elle vient la fin des projets...généralement inachevés. En ce moment je travail sur la compre Problème avec delete[] [ par gbourgeois0019 ] SalutJ'ai un petit problème. voici le code :char* Temp = new char[100];char* Title = new char[100];strcpy(Temp,"Exemple");Title = Temp + 1 ;delete[] T fichie texte [ par cedric3456 ] bonjour je suis tres nul en c++ je debute pouvez vous m'aidez je cherche a faire 3 fonction sur Dev-C++ 4.9.9.2fonction :ecrire (nom_fichier,chaine_ch Comment free un char *** ? [ par kaervas ] Bonjour, j'ai un probleme pour free un char ***,pour le char ** j'utilisais cette fonction (qui a priori marche):void      dfree(char **str){ int    i Allocation dynamique de char* .... [ par Gendal67 ] Bonjour à tous....Avant d'acheter un flingue pour de bon, je me suis dit qu'il pourrait etre judicieux de demander de l'aide quelque part... voila, je


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,482 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales