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 :

Vérifier si deux chaînes de caractères entées sont contenues dans un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2022
    Messages : 5
    Par défaut Vérifier si deux chaînes de caractères entées sont contenues dans un fichier
    Salut ici j'ai écris un programme qui demande d'entrer deux chaines de caractères et vérifie si elles sont contenues dans un fichier (dictionnaire) puis attribut une note(score) à chaque chaine . Le programme n'exécute pas la fonction validation() , quelqu'un peut m'aider svp ?

    Mon code :

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    //Pour verifier si la proposition est valide et attribuer le score
    void validation(char propo1, char propo2){
        int score1 = 0,score2 = 0;char chaine[4069980] = "";
        int longpropo1 = 0,longpropo2 = 0;
        FILE* fichier;
        fichier = fopen("dicotionnaire.txt", "r");
     
        if (fichier != NULL){
               int i = 0;
              while(fgets(chaine, 4069980, fichier) != NULL){
                if(strcmp(chaine,propo1)){ 
                    longpropo1 = strlen(propo1);
                    if(longpropo1<2){
                        score1 = 1;
                    }
                    else if(longpropo1<4){
                        score1 = 5;
                    }
                    else if(longpropo1<7){
                        score1 = 10;
                    }    
                    else if(longpropo1<10){
                        score1 = 15;
                    }
                    printf("%d", score1);
                }
                else {
                    printf("%d", score1);
                }
                if(strcmp(chaine,propo2)){
                    longpropo2 = strlen(propo2);
                    if(longpropo2<2){
                        score2 = 1;
                    }
                    else if(longpropo2<4){
                        score2 = 5;
                    }
                    else if(longpropo2<7){
                        score2 = 10;
                    }    
                    else if(longpropo2<10){
                        score2 = 15;
                    }
                    printf("%d", score2);
                }
                else{
                    printf("%d", score2);
                }
                 i++;
               }
        }
       else{
            printf("Impossible d'ouvrir le fichier ");
        }
        fclose(fichier);
    }
     
    int main(){
        char p1[9],p2[9];
     
        printf("Entrez P1: ");
        scanf("%s",p1);
        printf("\nEntrez P2: ");
        scanf("%s",p2);
        printf(p1);
        printf("\n");
        printf(p2);
     
        validation(p1,p2);
        return 0;
    }

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 853
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Waris03 Voir le message
    Le programme n'exécute pas la fonction validation()
    Ah si, elle est parfaitement exécutée. Rajoute un printf() au début et tu verras qu'il s'affiche.
    Si maintenant la fonction ne produit pas le résultat attendu ça c'est une autre histoire. Là il faut afficher les valeurs lues, les valeurs calculées et vérifier chaque étape savoir si ce qui s'affiche est ce qui devrait s'afficher. Bref printf() sera ton seul ami.

    Accessoirement, chercher deux chaines et leur attribuer des notes c'est faire deux fois le travail "chercher une chaine et lui attribuer une note". Donc (enfin ça c'est juste un avis personnel) j'aurais écrit une fonction qui fait le travail pour une chaine et je l'aurais appelée deux fois dans validation(). Plus simple à coder, et à débugguer.

    Citation Envoyé par Waris03 Voir le message
    quelqu'un peut m'aider svp
    Commence par corriger tous les warnings car un warning c'est un message disant "je ne suis pas certain de ce que je comprends donc je compile mais à vos risques, vous n'avez qu'à coder les choses correctement". Par exemple la fonction "validation()" est présumée prévue pour traiter deux chaines (c'est toi qui le dit) mais ses paramètres sont des char. Or un char ce n'est pas une chaine. Et tout le reste à l'avenant.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 328
    Par défaut
    Pour commencer, la prochaine fois mets ton code entre balises code.

    Ensuite, il faut lire les warning du compilateur.
    Je vais passer sur les warnings "implicit declaration of function" du à l'absence de string.h

    En gros la signature de ta fonction attend 2 chars et tu lui passes des tableaux de char.
    Ensuite, utilises correctement strcmp, strcmp retourne une valeur int, c’est celle-ci que tu dois tester, pas juste faire un if strcmp(..) et les fonctions de traitement de chaines travaillent sur des char*, pas des tableaux de char.
    NULL sur le test while n'est pas suffisant pour détecter correctement la fin de fichier.
    si tu regardes les warning, ça gueule aussi sur l'utilisation de strlen, même prob que la signature de ta fonction, strlen attend un type char*, tu lui fourni un type tableau de char de 9 caractères.

    Une chaine en C est un tableau de char devant se terminer par le caractère \0, la taille de la chaine est déterminable en lisant caractère par caractère jusqu'à trouver \0 (c'est ce que fait strlen;, le caractère \0 ne compte pas dans la taille de chaine retournée).

    La réservation mémoire pour une chaine peut être supérieure à la taille de la chaine. Elle doit l'être d'au minimum chaine +1 caractère pour le \0.

    Pour traiter des chaines, on utilise en général un pointeur, celui-ci pointant sur la 1ère entrée d'un tableau de char. Tu as vu les pointeurs ?
    schématiquement, faire un char[100] va déclarer une variable tableaux de char de 100 cases mémoires. Tant que tu n'y touches pas, les cases contiennent des valeurs indéfinies au sens de ton programme, en fait la valeur en l'état de la case mémoire. Pour avoir une chaine valide, il faut que dans tes 100 caractères, le caractère \0 apparaisse, sinon tu auras un comportement indéfini, et donc un bug potentiellement difficile à déceler.

    Si tu veux traiter une chaine sous forme de pointeur, tu peux aussi déclarer celui-ci via :
    puis réserver de la mémoire avec malloc (ici 100 caractères :
    Ta chaine pourra alors avoir une longueur max de 99 caractères.
    Pour représenter une chaine vide valide au sens C, il faudra ensuite que le 1er caractère contienne \0 :
    tu vois qu'on peut accéder au contenu sous forme de tableau également
    attention : les fonctions de chaine ne s'occupent pas de savoir si les paramètres passés sont valides en dehors de la vérification du type par le compilateur
    Exemple : strcpy qui copie une chaine ne se préoccupe pas de savoir si la destination a suffisamment de place, strlen arrête sa comparaison lors de la présence de \0, si ta chaine est invalide car ne contient pas de \0, la fonctin va parcourir la mémoire jusqu'à le trouver : avec en résultat soit une comparaison erronée, soit un crash de l'appli par accès hors de la zone mémoire de l'appli.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 154
    Billets dans le blog
    4
    Par défaut
    J'y crois pas 1 seconde que ce code compile.
    Ça alloue un tableau de 4 millions d'octets sur la stack, ça appelle strcmp(char*, char) et strlen(char) qui n'existent pas et appelle validation(char*, char*) qui n'existe pas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 328
    Par défaut
    J'y crois pas 1 seconde que ce code compile.
    Il compile avec la commande gcc test.c en affichant les warnings évoqués mais pas sûr qu'un vrai développeur compile sans options.

    Par contre évidemment il segfault.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 853
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bousk Voir le message
    J'y crois pas 1 seconde que ce code compile.
    Moi non plus, au début j'ai vu tous ces warnings je pensais qu'il compilait pas (ça a même été ma première réponse). Puis j'ai vu le post de chrtophe qui laissait sous entendre que ça s'exécutait et j'ai alors recompilé en examinant mieux les messages mais oui, que des warnings donc ça compile. Ca compile de la mélasse ok mais ça compile.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 328
    Par défaut
    Moi non plus, au début j'ai vu tous ces warnings je pensais qu'il compilait pas (ça a même été ma première réponse). Puis j'ai vu le post de chrtophe qui laissait sous entendre que ça s'exécutai
    En 1er jet, j'ai pas regardé non plus si ça compilait, vu les grosses erreurs indiquées par warning (et pourtant je suis pas un expert en C loin de là). Vu la remarque de bousk, légitime de prime abord, j'ai quand même regardé, et ça compile ... mais un code qui ne fonctionne pas.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/09/2007, 12h59
  2. Réponses: 4
    Dernier message: 07/06/2007, 22h35
  3. Comparer deux chaînes de caractère
    Par natie_49 dans le forum Langage
    Réponses: 2
    Dernier message: 28/03/2007, 11h53
  4. Réponses: 3
    Dernier message: 16/03/2007, 22h22
  5. Comparer deux chaînes de caractères
    Par camoa dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 10/12/2006, 14h30

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