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

  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"?

  7. #7
    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
    C'est fait un peu a la-rache et il manque les verifications de retour de malloc, mais ca marche.

    Remplace le main par le nom de ta fonction et hop roulez jeunesse.

    P.S. Les printf en bas c'est pour verifier que ca marche, enleves les aussi.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    int             count_words(char *str, char delim)
    {
      int           i;
      int           nb_words;
     
      nb_words = 0;
      for (i = 0; str[i]; i++)
        if ((i == 0 && str[i] != delim) || str[i] == delim)
          {
            nb_words++;
            while (str[i] && str[i] == delim)
              i++;
          }
      return (nb_words);
    }
     
    char            **split(char *str, char delim)
    {
      char          **splitted_tab;
      int           nb_words;
      int           i;
      int           word_index;
     
      nb_words = count_words(str, delim);
      splitted_tab = malloc((nb_words + 1) * sizeof(*splitted_tab));
      if (splitted_tab)
        {
          word_index = 0;
          for (i = 0; str[i]; )
            {
              while (str[i] && str[i] == delim)
                {
                  str[i] = '\0';
                  i++;
                }
              splitted_tab[word_index] = str + i;
              word_index++;
              while (str[i] && str[i] != delim)
                i++;
            }
        }
      splitted_tab[word_index] = 0;
      return (splitted_tab);
    }
     
    int             tab_len(char **tab)
    {
      int           len;
     
      len = 0;
      while (tab[len])
        len++;
      return (len);
    }
     
    int             main(int argc, char **argv)
    {
      char          *str;
      char          **tmp_tab;
      char          ***tab;
      int           i;
      int           j;
      int           len;
     
      if (argc != 2)
        {
          printf("boulet\n");
          return (EXIT_SUCCESS);
        }
      str = malloc((strlen(argv[1]) + 1) * sizeof(*str));
      memcpy(str, argv[1], strlen(argv[1]) + 1);
      tmp_tab = split(str, '\n');
      len = tab_len(tmp_tab);
      tab = malloc((len + 1) * sizeof(*tab));
      for (i = 0; i < len; i++)
        tab[i] = split(tmp_tab[i], ' ');
      tab[i] = NULL;
      free(tmp_tab);
     
      for (i = 0; tab[i]; i++)
        {
          printf("%d:\n", i);
          for (j = 0; tab[i][j]; j++)
            printf("\t%s\n", tab[i][j]);
        }
      return (EXIT_SUCCESS);
    }

  8. #8
    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
    le wash string a pour but de virer tout les '\n' les '\t' et les ' ' en trop

  9. #9
    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
    en trop
    C'est à dire?
    En double?

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