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 :

Décomposition mot lettre par lettre dans tableau de mots


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 7
    Points : 9
    Points
    9
    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 : 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
     
    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 régulier
    Inscrit en
    Avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Avril 2010
    Messages : 66
    Points : 70
    Points
    70
    Par défaut
    Bonjour,

    J'ai teste ce code et ca semble marcher :

    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
     
    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
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 7
    Points : 9
    Points
    9
    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.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/07/2008, 23h44
  2. Afficher un texte lettre par lettre
    Par koKoTis dans le forum Flash
    Réponses: 2
    Dernier message: 11/12/2007, 21h14
  3. Comparer une chaîne lettre par lettre
    Par ero-sennin dans le forum C++Builder
    Réponses: 9
    Dernier message: 10/11/2007, 21h23
  4. Réponses: 6
    Dernier message: 23/01/2007, 17h20

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