IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

chaine et comportement indefini


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de gandalfar
    Inscrit en
    Novembre 2004
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 145
    Par défaut chaine et comportement indefini
    bonjour a tous.

    je viens ici pour demander de l aide car j ai un comportement indefini qui je
    pense viens de ma fonction str_to_wordtabtab. cette fonction a pour but de
    transformer un buffer de plusieur chaine en un tableau contenant contenant
    chaque mot inclu dans un tableau contenant chaque phrase.
    J appelle donc la fonction str_to_wordtabtab a cet endroit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        make_cmd(args, str_to_wordtabtab(wash_string(buffer)), find_player(args, fd));
    la fonction wash string a pour but de faire un premier ecremage de la
    chaine en enlevant tout les \n et les \t en trop:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    char    *wash_string(char *str)
    {
      int   cpt;
      int   i;
      char  *str2;
     
      i = 0;
      cpt = 0;
      while (str[0] == ' ' || str[0] == '\t')
        {
          str++;
        }
      while (str[cpt] != '\0')
        {
          if (str[cpt] == ' ' || str[cpt] == '\t' || str[cpt] == '\n')
            if (str[cpt + 1] == ' ' || str[cpt + 1] == '\t' || str[cpt + 1] == '\n')
              i++;
          cpt++;
        }
      str2 = xmalloc(cpt - i * sizeof(*str2));
      cpt = 0;
      i = 0;
      while (str[i + cpt] != '\0')
        {
          while ((str[cpt + i] == ' ' || str[cpt + i] == '\t' || \
                  str[cpt + i] == '\n') && (str[cpt + 1 + i] == ' ' \
                                            || str[cpt + 1 + i] == '\t'))
            cpt++;
          str2[i] = str[cpt + i];
          i++;
        }
      if (str2[i - 2] == ' ' && str2[i - 1] == '\n')
        {
          str2[i - 2] = '\n';
          str2[i - 1] = '\0';
        }
      str2[i] = '\0';
      return (str2);
    }
    mon str_to_word_tabtab utilise 3 fonction que j ai coder pour me faciliter la
    tache:
    my_nbstr qui me renvoie le nombre d occurence d un caractere dans une chaine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    int     my_nbstr(char *str, char c)
    {
      int   i;
      int   cpt;
     
      i = 0;
      cpt = 0;
      while(str[cpt] != '\0')
        {
          if (str[cpt] == c)
            i++;
          cpt++;
        }
      return (i);
    }
    my_inbstr qui me renvoie la position d une occurence dans une chaine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int     my_inbstr(char *str, char c)
    {
      int   i;
     
      i = 0;
      while(str[i] != c && str[i] != '\0')
        i++;
      return (i);
    }
    my_strchr qui m avance mon pointeur sur chaine jusqu a trouver une
    occurence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void    my_strchr(char **str, char c)
    {
      while (*(*str) != c && *(*str) != '\0')
        (*str)++;
      if (*(*str) == c)
        (*str)++;
      return ;
    }
    et voici mon str_to_wordtabtab

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    char    ***str_to_wordtabtab(char *str)
    {
      int   i;
      int   j;
      char  ***tab;
      char  *tmp;
      char  *tmp2;
      char  *str2;
     
      tab = xmalloc((my_nbstr(str,'\n') + 2) * sizeof(*tab));
      tab[my_nbstr(str,'\n')] = '\0';
      str2 = str;
      for (i = 0 ; i < my_nbstr(str, '\n'); i++)
        {
          tmp = xmalloc((my_inbstr(str2, '\n') + 2) * sizeof(*tmp));
          memcpy(tmp, str2, my_inbstr(str2, '\n'));
          tmp[my_inbstr(str2, '\n')] = '\0';
          tab[i] = xmalloc((my_nbstr(tmp, ' ') + 2) * sizeof (**tab));
          tmp2 = tmp;
          for (j = 0 ; j < my_nbstr(tmp2, ' ') + 1; j++)
            {
              tab[i][j] = xmalloc((my_inbstr(tmp,' ') + 2) * sizeof(***tab));
              memcpy(tab[i][j], tmp, my_inbstr(tmp,' '));
              tab[i][j][my_inbstr(tmp, ' ')] = '\0';
              my_strchr(&tmp, ' ');
            }
          tab[i][j] = '\0';
          my_strchr(&str2, '\n');
          tmp = tmp2;
          free(tmp);
        }
      tab[i] = '\0';
      free(str);
      return (tab);
    }
    je pense que mon probleme vient ou du positionnement des '\0' ou du
    mallocage car il me cree des erreurs d affichage ou de temp en temp de segmentation fault, mais je n arrive pas a voir l erreur que je fais.
    merci de votre aide

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    On peut utiliser les fonctions de la SL:
    my_inbstr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return strchr(str,c)-str;
    my_strchr
    ...

  3. #3
    Membre éprouvé Avatar de gandalfar
    Inscrit en
    Novembre 2004
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 145
    Par défaut
    oui aussi mais ces fonctions marchent je pense que le probleme vient plus de l allocation de memoire de mes pointeurs

  4. #4
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Fais un str_to_wordtab simple et appelle le une premiere fois pour la premiere division, puis tu le rappelle dans une boucle pour la deuxieme division.

    A mon avis ce sera plus simple.

  5. #5
    Membre éprouvé Avatar de gandalfar
    Inscrit en
    Novembre 2004
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 145
    Par défaut
    oui je pourrais faire ca,
    mais j aimerez quand meme arriver a voir mon erreur comme ca
    ca donnerait un sens au temp que j ai perdu sur cette fonction ...

  6. #6
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Que doit faire exactement la fonction "wash_string"?

Discussions similaires

  1. Supprimer chaine de caractères indefinie avec PHP
    Par Pierrot11 dans le forum Langage
    Réponses: 4
    Dernier message: 14/01/2014, 15h51
  2. Réponses: 4
    Dernier message: 28/03/2007, 17h27
  3. savoir si une chaine ne comporte que des lettres
    Par kamouminator dans le forum C
    Réponses: 22
    Dernier message: 16/11/2006, 02h19
  4. Réponses: 2
    Dernier message: 21/07/2006, 12h16
  5. Modifier tout les fichier comportant une chaine
    Par narmataru dans le forum Linux
    Réponses: 10
    Dernier message: 28/09/2004, 16h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo