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 :

probleme char* et liste chainée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 95
    Par défaut probleme char* et liste chainée
    Bonjour dans le cadre d'un projet j'ai un programme de traduction de morse à faire en C.

    Je recupere à partir d'un fichier texte, le code morse correspondant à chaque lettre.

    Ce code est dans un char*. Je dois ensuite remplir une liste chainée (obligatoirement) contenant ce meme code et la lettre correspondant.


    j'ai donc une liste:

    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
     
    #ifndef liste_h
    #define liste_h
    #include<stdio.h>
    #include<stdlib.h>
     
     
    struct elem {     char alpha;
                      char *morse;
                      struct elem* suiv;
                  };
     
    typedef struct elem element;
    typedef struct elem* liste;
     
     
    #endif
    Les fonctions pour connaitre les valeurs de la liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char alphaValeur(liste l)
    {
    return l->alpha;
    }
    char morseValeur(liste l)
    {
    return l->morse;
    }
    Celle pour construire ma liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    liste cons(char a,char *m,liste l)
    {
     
    liste p;
    p=(liste)malloc(sizeof(element));
    p->alpha=a;
    //strcpy(p->morse,m);
    p->morse=*m;
    p->suiv=l;
    return p;
    }
    Et celle pour l'afficher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void afficheliste(liste l) 
    {
    liste p=l;
    while(p)
    {
    printf("(%c,%c) ",alphaValeur(p),morseValeur(p));
    p=reste(p);
    }
    printf("\n");
    }
    Voila le souci c'est que je n'ai pas le code morse complet, seulement la premiere lettre.
    J'ai deja essayé de mettre un "%s" dans la fonction d'affichage mais le programme plante, une "*" dans la fonction qui me retourne le code morse mais le programme plante.

    Je ne trouve pas de solutions si vous pouviez me donner un coup de pouce ça serait plutot cool.

    Voici au passage ma procedure qui lit mon fichier texte:

    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
     
     
    void essai2()
    {
         FILE* fichier = NULL;
        fichier = fopen("txtMorse.txt", "r");
        char alpha;
        char *morse=NULL;
        char chaine[TAILLE_MAX] = "";
        liste l=NULL;
        int index;
     
     
        if (fichier != NULL)
        {
            while (fgets(chaine, TAILLE_MAX, fichier)!= NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
            {
                alpha=chaine[0];
                printf("%c",alpha); 
                morse=strpbrk(chaine,".-");
                printf("%s\n",morse);
                l=cons(alpha,morse,l);
     
            }
        }
         fclose(fichier); // On ferme le fichier qui a été ouvert 
     
         afficheliste(l);       
    }
    Merci d'avance.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct elem {     char alpha;
                      char *morse;
                      struct elem* suiv;
                  };
    Tu as un simple char *morse.
    Tu ne fais que copier un pointeur ici. Tu ne recopies pas chaque caractère de la chaîne.
    Tu as enlevé le strcpy, tu aurais du le laisser ! MAIS, il faut auparavant que dans ta chaîne il y ait la place nécessaire. Deux solutions : tu alloues l'espace dynamiquement. Ou, plus simples, tu changes un peu ta structure en

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 95
    Par défaut
    Merci de ta réponse qui a été rapide je test ça demain, en fait juste avant mon strcpy il faut que je fasse un malloc?

    Et ma fonction qui me retourne le char* de ma liste reste en:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char morseValeur(liste l)
    {
    return l->morse;
    }
    ou passe en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *morseValeur(liste l)
    {
    return l->morse;
    }

  4. #4
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Si tu choisis cette solution, tu n'auras pas besoin de faire de malloc. La mémoire est DEJA présente quand tu crées la structure. Du moment que tu n'essaies pas de copier plus de caractères que MAX_CHR , tu n'auras pas de problème.

    En effet, je navais pas fait attention à ça, mais cest bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char *morseValeur(liste l)
    {
    return l->morse;
    }
    car tu retournes un pointeur vers un caractère.
    Mais après faire une fonction pour ça, cest pas forcément très intéressant. Une macro à la limite, mais ca reste sans grand intérêt.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define morseValeur(l) ( (*(l)).morse)

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 95
    Par défaut
    Merci pour l'astuce du #define, c'est simplement notre prof qui nous a montrer par le biais d'une fonction.

    Le probleme c'est que le nombre de caracteres morse est variable donc je ne vais pas allouer un tab de taille fixe.

    Je test tout ça j'espere que ça va fonctionner.

    Merci encore de ton aide.

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 95
    Par défaut
    Ca marche nikel j'ai juste eu un ptit soucis car dans mon fichier texte j'ai un saut de ligne à la fin de mes caracteres en morse.

    Je l'ai réglé avec un:

    if(morse[strlen(morse)-1]=='\n')
    morse[strlen(morse)-1]='\0';

    Car avec un strncpy(morse2,morse,strlen(morse)-1) j'avais des caracteres farfelus qui apparaissaient pour certaines lettres.

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

Discussions similaires

  1. probleme avec une liste chainée
    Par simpatico dans le forum Débuter
    Réponses: 10
    Dernier message: 25/07/2011, 08h45
  2. Probleme avec une liste chainée
    Par apen2k2 dans le forum C
    Réponses: 7
    Dernier message: 14/12/2006, 16h31
  3. petit probleme avec une liste chainée
    Par kamouminator dans le forum C
    Réponses: 26
    Dernier message: 06/11/2006, 20h18
  4. Réponses: 2
    Dernier message: 10/10/2005, 02h25
  5. Réponses: 11
    Dernier message: 02/05/2005, 19h30

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