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 :

tri de chaîne de caractère depuis un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut tri de chaîne de caractère depuis un fichier
    Bonjour
    voilà j'ai fais un programme cependant je bute sur la dernière étape de mon programme
    Lors du tri, je ne pense pas que cela fonctionne, si je ne rentre qu'un seul caractère à la place des mots , lors de l'affichage après tri il m'affiche null
    Par contre si je rentre une chaîne de plusieurs caractère, il ne m'affiche rien du tout ...

    Quelqu'un peut t'il m'aider ? mon code : https://pastebin.com/7nxXAPf0
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char const *argv[])
    {
    //          Declaration variable
        FILE *pfichier = fopen("MOTS.TXT","w");
        char mot[50];
        char *tri;
        char *temp;
        int i,nb_mot=0,a,b;
        int longueur=0;
     
    //          Initialisation interractive
       printf("Combien de mot voulez vous rentrer ? : ");
        scanf("%d",&nb_mot);
     
    //          Ecriture dans le fichier
        for (i = 0; i < nb_mot; ++i)
        {
            printf("Mot #%d : ",i+1);
            scanf("%50s",&mot);
            longueur=longueur+strlen(mot);
            fprintf(pfichier,"%s\n",mot );
        }
        tri = malloc(sizeof(char)*longueur);
        fclose(pfichier);
    //          Lecture
        pfichier = fopen("MOTS.TXT","r");
        if (pfichier==NULL)
            {
                puts("erreur");
                exit(1);
            }
            i=0;
        while (fgets(mot,50,pfichier))
        {
            printf("%s",mot);
            tri=mot;
            i++;
        }
        fclose(pfichier);
        for (a = 0; a < nb_mot-1; a++)
        {
            for (b = a+1; b < nb_mot; b++)
            {
                if (*(tri+a)>*(tri+b))
                {
                    temp = *(tri+a);
                    *(tri+a) = *(tri+b);
                    *(tri+b)= temp;
                }
            }
        }
        for (i = 0; i < nb_mot; ++i)
        {
            printf("%s\n",tri[i] );
        }
     
        return 0;
    }
    d'avance, je vous remercie

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 4
    Par défaut
    Bonjour !

    En C, les chaînes de caractères doivent absolument être terminées par le caractère NUL ('\0'), comme vous le savez peut-être ; il est utilisé comme indicateur par des fonctions comme strlen ou printf afin de savoir quand arrêter de lire la chaîne.

    À la ligne 23 de votre code, vous lisez cinquante caractères depuis le fichier dans un tableau de type char de la bonne taille, et tout va bien a priori. En effet, vous oubliez le caractère NUL ! Ainsi, il y a plusieurs possibilités :

    • Augmenter la taille du tableau de 50 vers 51 pour prendre en compte le caractère NUL
    • Diminuer la taille de la lecture de 50 vers 49 pour laisser de la place au caractère NUL

    ... Et dans ces deux cas, il est nécessaire de rajouter le caractère NUL soit-même.

    • Ou utiliser une fonction prenant la taille de la chaîne comme paramètre, comme strnlen


    À vous de choisir !

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Ligne 23, le scanf lit 50 caractères maximum, mais scanf (contrairement à strncpy) met toujours le terminateur même si on atteint le maximum. Il n'y a pas de problème de terminateur.

    Par contre tri est un pointeur sur des char, d'ailleurs il pointe sur le début de mot. Donc quand on parcours tri, on trie mot donc le dernier mot lu dans le fichier. Mais on suppose une longueur nb_mot qui n'est pas du tout la longueur du mot d'où ...
    La boucle d'affichage finale parcours tri en supposant elle aussi que tri est un tableau de chaines, le printf "%s" d'un char n'a pas de sens. Le compilateur doit émettre ici un monstrueux warning signalant le non sens.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut
    C'est bon j'ai finalement trouver la solution à l'exercice,
    Je la poste ici au cas ou quelqu'un à le même problème <
    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
    /*Ecrire un programme qui charge les mots du fichier MOTS.TXT
    dans la mémoire centrale, les trie d’après la méthode par
    propagation (méthode de la bulle) et les écrit dans un deuxième
    fichier MOTS_TRI.TXT.*/
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char const *argv[])
    {
    //          Declaration variable
        FILE *pfichier = fopen("MOTS.TXT","w");
        char tri[255][255];
        char *temp;
        temp= malloc(sizeof(char)*255);
        int i,j,nb_mot=0,a,b;
     
    //          Initialisation interractive
        printf("Combien de mot voulez vous rentrer ? : ");
        scanf("%d",&nb_mot);
        char mot[nb_mot];
     
    //          Ecriture dans le fichier
        for (i = 0; i < nb_mot; ++i)
        {
            printf("Mot #%d : ",i+1);
            scanf("%255s",mot);
            fprintf(pfichier,"%s\n",mot );
        }
     
        fclose(pfichier);
     
    //          Lecture
        pfichier = fopen("MOTS.TXT","r");
        if (pfichier==NULL)
            {
                puts("erreur");
                exit(1);
            }
        for (i=0;i<nb_mot;i++)
        {
            //fscanf(pfichier,"%s",tri[i]);
            fgets(tri[i],50,pfichier);
        }
     
     
           for(a=0;a<nb_mot-1;a++)
                for(b=a+1;b<nb_mot;b++)
                    if(strcmp(*(tri+a),*(tri+b)) > 0 )
                    {
                        strcpy(temp , *(tri+a));
                        strcpy(*(tri+a) , *(tri+b));
                        strcpy(*(tri+b) , temp);
                    }
     
     
    //              Affichage
        for (i=0;i<nb_mot;i++)
            printf("%s\n",tri[i]);
     
        fclose(pfichier);
        return 0;
    }

Discussions similaires

  1. Retouver une chaîne de caractère dans un fichier
    Par thierrykammi dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 26/09/2008, 09h26
  2. Réponses: 7
    Dernier message: 27/04/2007, 10h01
  3. Changer des chaînes de caractères dans un fichier
    Par troumad dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 10/11/2006, 08h45
  4. Réponses: 6
    Dernier message: 08/08/2006, 09h14

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