Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Invité régulier
    Inscrit en
    avril 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 23

    Informations forums :
    Inscription : avril 2010
    Messages : 7
    Points : 5
    Points
    5

    Par défaut Décomposition mot lettre par lettre dans tableau de mots

    Bonjour à tous !
    Comme j'ai tenté de préciser dans l'intitulé du Topic, je souhaite créer une fonction qui copie le i-ème caractère d'un mot entré en paramètre pour le placer dans un tableau de chaînes de caractères (pas de caractères car il va grandir par après).
    Mon code est le suivant :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    char * permut (char * t) {
      int i;
      char * tmp = (char *) malloc ((strlen(t))*sizeof(char));
      for (i=0;i<strlen(t)-1;i++) {
        tmp[i]=t[i+1];
      }
      tmp[strlen(t)-1]=t[0];
      return tmp;
    }
     
    char ** separe (char * code, int nb) {
    	char ** tab = (char **) malloc (nb*sizeof(char *));
    	int i;
    	char * c = (char *) malloc (nb*sizeof(char));
    	for (i=0;i<nb;i++) {	
    		c = strncpy(c,code,1);
    		tab[i]=c;
    		code = permut(code);
    	}
    	return tab;
    }
    Si j'ajoute un printf("%s\n", tab[i]) après le code = ... dans la boucle for, il m'affiche bien chaque lettre.
    Seulement, si je fais un printf des tab[i] plus loin dans le main, je constate que les tab[i] sont tous égaux à la dernière lettre du char * code et je ne comprends pas pourquoi.
    J'ai aussi essayé de remplacer tab[i]=c par un strcpy et sans la fonction permut mais j'aboutis à une segmentation fault.
    Merci de votre aide

  2. #2
    Membre du Club
    Inscrit en
    avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 23

    Informations forums :
    Inscription : avril 2010
    Messages : 66
    Points : 56
    Points
    56

    Par défaut

    Bonjour,

    J'ai teste ce code et ca semble marcher :

    Code :
    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
     
    char            **separe(char *code, int nb)
    {
      char          **tab;
      int           a; // Correspond aux chaines de caractere du tableau
      int           b; // Correspond aux caracteres des chaines de caractere du tableau
      int           i; // C'est le curseur qui va parser code
     
    if (code == NULL) // On securise au cas ou code est NULL.
    return (NULL);
      tab = malloc(sizeof(char*) * (nb + 1)); // On malloc de nb (verifie que nb est bien egal au nombre de lettre de code)
     
      i = 0;
      a = 0;
      while (code[i] && i < nb) // On verifie code[i] pour etre sur de ne pas chercher ailleurs que dans code.
        {
          b = 0;
          tab[a] = malloc(sizeof(char) * nb); // On malloc la case (j'ai repris la taille que tu donnes a ton 'c')
          tab[a][b++] = code[i]; // On copie le caractere.
          tab[a][b] = NULL; // On met la derniere case a NULL, histoire d'ecrire a la fin.
          a++;
          i++;
        }
      tab[a] = NULL; // On finit en mettant la derniere case du tableau a NULL pour pouvoir le parser plus tard.
     
      return (tab);
    }
    Voila, j'espere t'avoir aide
    (j'espere avoir bien compris ton probleme, car je n'ai pas compris ta fonction permut()).

  3. #3
    Responsable Modération
    Avatar de diogene
    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 664
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 664
    Points : 12 539
    Points
    12 539

    Par défaut

    je constate que les tab[i] sont tous égaux à la dernière lettre du char * code et je ne comprends pas pourquoi.
    Parce que tous les tab[i] contiennent la même chose : la valeur de c, adresse du seul tableau de caractères qui a été alloué par separe() et que ce tableau contient le dernier caractère traité.

    Code :
    1
    2
    3
    4
    5
    6
    	char * c = (char *) malloc (nb*sizeof(char));
    	for (i=0;i<nb;i++) {	
    		c = strncpy(c,code,1);
    		tab[i]=c;
    ...
    	}
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Invité régulier
    Inscrit en
    avril 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 23

    Informations forums :
    Inscription : avril 2010
    Messages : 7
    Points : 5
    Points
    5

    Par défaut

    Merci bien Hoder, ta fonction fait exactement ce que je voulais, il fallait juste remplacer
    tab[a][b] = NULL; // On met la derniere case a NULL, histoire d'ecrire a la fin.
    par tab[a][b] = '\0' sinon mon compilateur râle mais c'est optionnel j'imagine.

    Effectivement diogene, là était mon erreur, je vais essayer de modifier ma fonction dans ce sens.

    Merci à vous

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •