Correction code en C

a marqué ce sujet comme résolu.

Salut à tous je suis en train de faire un programme et j’ai pas mal d’erreur mais j’ai du mal à les résoudre est-ce que vous pouvez m'aider s’il vous plaît ? Explications du programme : J’ai dans un fichiers .txt une liste de nom,il y en a une multitude. Et par exemple, si je saisis le nom DUPONT, j’aimerais qu’il affiche toute les personnes qui s’appelle DUPONT. Par exemple:

DUPONT PIERRE
DUPONT JEAN
DUPONT LOIC
/*Liste des en-tête nécessaires*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char nomfichier[128] = { 0 };
char tabfichier[BUFSIZ];
char buffer[BUFSIZ];


/* Fonction pour vider le buffer */
void viderBuffer(void)
{
    int c;
    while ((c = getchar()) != EOF && c != '\n');

}

/*Fonction pour rechercher des mots*/
int chercher_mot(int mot, int fichier ) {
    
    {

        
        char* fi = strchr(tabfichier, '\n');
        if (fi != NULL) {
            *fi = 0;
        }
    }

    while (fgets(buffer, sizeof(buffer),fichier)) {
        char* tab, * c = strchr(buffer, '\n');

        if (c != NULL)
        {
            *c = 0;    // 0 de fin de chaîne
        }

        else
        {
            continue;   // Lecture d'une nouvelle ligne
        }

        // Recherche du mot 'tab' dans 'buffer'
        tab = buffer;
        while ((tab = strstr(tab, tabfichier)) != NULL)
        {
            printf("mot trouvé en %d colonne de %s\n", (int)(tab - buffer), buffer);
        }
    }   
}

/*Fonction principale main()*/
int main() {

    //Choix du fichier
    printf("nom de fichier ? ");
    char nom_de_fichier[128];
    scanf("%s", nom_de_fichier);

    //Ouverture du fichier choisi
    FILE* fichier;
    fichier = fopen(nom_de_fichier, "r");

        //Si le fichier ne s'ouvre pas (la réponse est nulle)
        if (fichier == NULL) {
            perror("fpopen");
            return;
        }
        //Sinon le fichier s'ouvre et la fonction s'exécute
        else {
            printf("Mot ?");
            char mot[128];
            scanf("%s", mot);
            viderBuffer(buffer);    
            chercher_mot(mot, fichier);
            fclose(fichier);
        }
    return 0;
}

Merci de votre aide ;)

+0 -0

Salut,

Commence par corriger tous les avertissements que tu as. Compile avec l’option -Wall pour en avoir plus. Tu peux rajouter -Werror pour transformer tous les avertissements en erreur et -Wfatal-errors pour que la compilation s’arrête à la première erreur (plutôt que d’avoir pleins d’erreurs d’un coup, tu pourras les régler une par une).

Ensuite je te conseille également de faire d’autres fonctions, par exemple une fonction qui recherche le mot dans une ligne. Et de supprimer ces variables globales.

Et finalement certaines parties de ton code sont mal indentées. Choisis un style d’indentation et respecte-le.

+0 -0

Pendant qu’on y est, la fonction qui est définie comme ceci

void viderBuffer(void) { ... }

est appelée avec un paramètre

viderBuffer(buffer);    

ce qui n’est pas vraiment cohérent. Tu gagnerais du temps en n’essayant pas de taper des trucs au hasard en espérant que ça marche, ce qui a une probabilité de succès extrêmement faible.

+0 -0

C’est le même que sur openclassrooms ? Oui, effectivement j’ai poster le même sujet sur ces deux forums pour avoir des avis et des conseils différents. Et j’ai bien fait car c’est rouloude qui m’a conseiller d’intégrer la fonction

void viderBuffer(void) { ... }
``` et comme il m'a dit qu'il fallait vider le buffer j'ai donc écrit 
```c
viderBuffer(buffer); 

Merci Karnaj pour tes conseils c’est plus clair maintenant pour régler certaines erreurs.

Et voici le code dans un bloc code Vanadiae:

/*Liste des en-tête nécessaires*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char tabfichier[BUFSIZ];
char buffer[BUFSIZ];

/* void viderBuffer(void)
{
    int c;
    while ((c = getchar()) != EOF && c != '\n');
 
} */
 
/*Fonction pour rechercher des mots*/
int chercher_mot(char mot, char* fichier ) {
   {
 
         
        char* fi = strchr(tabfichier, '\n');
        if (fi != NULL) {
            *fi = 0;
        }
    }
 
    while (fgets(buffer, sizeof(buffer), fichier)) {
        char* tab, * c = strchr(buffer, '\n');
 
        if (c != NULL)
        {
            *c = 0;    // 0 de fin de chaîne
        }
 
        else
        {
            continue;  // Lecture d'une nouvelle ligne
        }
 
        // Recherche du mot 'tab' dans 'buffer'
        tab = buffer;
        while ((tab = strstr(tab, tabfichier)) != NULL)
        {
            printf("mot trouvé en %d colonne de %s\n", (int)(tab - buffer), buffer);
        }
    } 
} 
 
/*Fonction principale main()*/
int main() {
 
    //Choix du fichier
    printf("nom de fichier ? ");
    char nom_de_fichier[128];
    scanf("%s", nom_de_fichier);
 
    //Ouverture du fichier choisi
    FILE* fichier;
    fichier = fopen(nom_de_fichier, "r");
 
        //Si le fichier ne s'ouvre pas (la réponse est nulle)
        if (fichier == NULL) {
            perror("fpopen");
            return;
        }
        //Sinon le fichier s'ouvre et la fonction s'exécute
        else {
            printf("Mot ?");
            char mot[128];
            scanf("%s", mot);
            /*viderBuffer(buffer); */ 
            chercher_mot(mot, fichier);
            fclose(fichier);
        }
    return 0;
}

Et voici une erreur que je comprends mais que je n’arrive pas à résoudre:

essai.c: In function ‘chercher_mot’: essai.c:27:42: warning: passing argument 3 of ‘fgets’ from incompatible pointer type [-Wincompatible-pointer-types] while (fgets(buffer, sizeof(buffer), fichier)) {

Merci à tous pour votre aide

+0 -0

Regarde le type de fichier dans ta fonction chercher_mot.

+1 -0

D’accord j’ai fais ça du coup

int chercher_mot(char mot, int fichier )

étant donné que fichier est déclaré en int

J’ai bien fais ?

Edit: Maintenant j’arrive à lister un nom mais le problème c’est que je n’ai rien saisi et que c’est la première ligne du fichier. Et elle se répète indéfiniment :(

+0 -0

Non,

Un fichier est de quel type ? Quel type utilises-tu pour le fichier dans ton main ? Pourquoi tu veux mettre un int ? Donne nous une raison de le déclarer en tant que int ? Si tu n’as pas de raison de le faire, ne le fais-pas, ça s’appelle essayer de faire son programme tomber en marche et c’est une mauvaise idée.

EDIT : poste ton nouveau code.

EDIT 2 : ton problème est dû à la ligne while ((tab = strstr(tab, tabfichier)) != NULL). En effet, si strstr marche, tab pointera sur la sous-chaîne qui contient le mot cherché, et donc quand on retournera dans la boucle strstr va encore renvoyer le même pointeur et tu boucleras sur ça. Une solution est d’incrémenter tab à la fin de ta boucle pour passer au caractère suivant.

+0 -0

Fichier est de type int vu qu’il est défini de cette manière :

FILE* fichier;
    fichier = fopen(nom_de_fichier, "r");

Je met un int parce que j’ai une erreur qui m’affiche ceci: essai.c:18:28: error: unknown type name ‘fichier’ int chercher_mot(char mot, fichier ) {

Et comme fichier est de type int du coup je me suis dit qu’il le fallait mettre

Edit 1 :

/*Liste des en-tête nécessaires*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 

char tabfichier[BUFSIZ];
char buffer[BUFSIZ];

/* void viderBuffer(void)
{
    int c;
    while ((c = getchar()) != EOF && c != '\n');
 
} */
 
/*Fonction pour rechercher des mots*/
int chercher_mot(char mot, int fichier ) {
   {
 
         
        char* fi = strchr(tabfichier, '\n');
        if (fi != NULL) {
            *fi = 0;
        }
    }
 
    while (fgets(buffer, sizeof(buffer),  fichier)) {
        char* tab, * c = strchr(buffer, '\n');
 
        if (c != NULL)
        {
            *c = 0;    // 0 de fin de chaîne
        }
 
        else
        {
            continue;  // Lecture d'une nouvelle ligne
        }
 
        // Recherche du mot 'tab' dans 'buffer'
        tab = buffer;
        while ((tab = strstr(tab, tabfichier)) != NULL)
        {
            printf("mot trouvé en %d colonne de %s\n", (int)(tab - buffer), buffer);
        }
    } 
} 
 
/*Fonction principale main()*/
int main() {
 
    //Choix du fichier
    printf("nom de fichier ? ");
    char nom_de_fichier[128];
    scanf("%s", nom_de_fichier);
 
    //Ouverture du fichier choisi
    FILE* fichier;
    fichier = fopen(nom_de_fichier, "r");
 
        //Si le fichier ne s'ouvre pas (la réponse est nulle)
        if (fichier == NULL) {
            perror("fpopen");
            return 0;
        }
        //Sinon le fichier s'ouvre et la fonction s'exécute
        else {
            printf("Mot ?");
            char mot[128];
            scanf("%s", mot);
            /*viderBuffer(buffer); */ 
            chercher_mot(mot, fichier);
            fclose(fichier);
        }
    return 0;
}

Le nouveau code

+0 -0

En quoi cette définition implique que fichier est du type int. Moi je vois plutôt un type FILE *. Et ce n’est pas que moi, ton compilateur aussi te le dit. Il faut lire les avertissements du compilateur et les régler.

warning: passing argument 3 of ‘fgets’ makes pointer from integer without a cast [-Wint-conversion]
   27 |     while (fgets(buffer, sizeof(buffer),  fichier)) {
      |                                           ^~~~~~~
      |                                           |
      |                                           int
In file included from cc.c:1:
/usr/include/stdio.h:564:14: note: expected ‘FILE * restrict’ {aka ‘struct _IO_FILE * restrict’} but argument is of typeint564 | extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
warning: passing argument 2 of ‘chercher_mot’ makes integer from pointer without a cast [-Wint-conversion]
   72 |             chercher_mot(mot, fichier);
      |                               ^~~~~~~
      |                               |
      |                               FILE * {aka struct _IO_FILE *}
cc.c:17:32: note: expected ‘int’ but argument is of type ‘FILE *’ {aka ‘struct _IO_FILE *’}
   17 | int chercher_mot(char mot, int fichier ) {

Pareil, le premier argument de chercher_mot est un mot, donc ça devrait être quoi le type (premier argument que tu n’utilises d’ailleurs pas alors que tu devrais) ?

+0 -0

Merci du coup j’ai remplacé

int chercher_mot(char mot, int fichier )

Par

int chercher_mot(char* mot, FILE*fichier  )

Et je n’ai plus d’erreur mais effectivement je n’ai pas placé 'mot' qui doit être utilisé pour la recherche, car actuellement il ne me sert à rien.

Edit: mais j’ai des gros doute sur l’endroit ou je dois mettre 'mot'

+0 -0

Ben mot c’est le mot que tu veux chercher dans le fichier, donc il te faut l’utiliser dans strstr pour chercher mot dans la ligne que tu es train de lire. Et n’oublie pas de donner à mot le bon type.

+0 -0

Il faut donc que je remplace le "tab" par mot ? genre :

while (fgets(buffer, sizeof(buffer),  fichier)) {
        char* tab, * c = strchr(buffer, '\n');
 
        if (c != NULL)
        {
            *c = 0;    // 0 de fin de chaîne
        }
 
        else
        {
            continue;  // Lecture d'une nouvelle ligne
        }
 
        // Recherche du mot 'tab' dans 'buffer'
        tab = buffer;
        while ((tab = strstr(tab, tabfichier)) != NULL)
        {
            printf("mot trouvé en %d colonne de %s\n", (int)(tab - buffer), buffer);
        }
    } 

Par

while (fgets(buffer, sizeof(buffer),  fichier)) {
        char* mot, * c = strchr(buffer, '\n');
 
        if (c != NULL)
        {
            *c = 0;    // 0 de fin de chaîne
        }
 
        else
        {
            continue;  // Lecture d'une nouvelle ligne
        }
 
        // Recherche du mot 'mot' dans 'buffer'
        mot = buffer;
        while ((mot = strstr(mot, tabfichier)) != NULL)
        {
            printf("mot trouvé en %d colonne de %s\n", (int)(mot - buffer), buffer);
        }
    } 

Edit: Après avoir essayé ça ne marche pas :(

+0 -0

C’est le même que sur openclassrooms ? Oui, effectivement j’ai poster le même sujet sur ces deux forums pour avoir des avis et des conseils différents. Et j’ai bien fait car c’est rouloude qui m’a conseiller d’intégrer la fonction

void viderBuffer(void) { ... }
``` et comme il m'a dit qu'il fallait vider le buffer j'ai donc écrit 
```c
viderBuffer(buffer); 

HelpMe

Il t’a fourni une fonction qui marche, et ce n’est pas sa faute si tu as suivi son conseil de travers. Pour l’appeller il faut écrire

viderBuffer();

sans arguments.

Autre point, que comptes-tu faire avec

mot = buffer;

ligne 15 ?

+0 -0

Non, là t’as juste remplacé tab par mot. Quand tu écris du code, tu dois savoir pourquoi tu écris chaque ligne et le sens que ça a. Ici ça n’a aucun sens de modifier mot. mot tu ne dois pas y toucher, c’est le mot qu’on recherche, il ne change pas, tu peux le mettre en pointeur constant sur des char constants. Le plus simple selon moi est de réécrire cette partie du code. Voici ce que tu peux faire (ici j’ai rajouté une fonction qui cherche le mot dans une ligne).

Fonction ChercherMotDansLigne(mot, ligne)
    pointeur (c'est le pointeur qui va parcourir la ligne), initialisé avec ligne
    Tant qu'on trouve mot dans pointeur
        Afficher le résultat
        Incrémenter pointeur (sinon la recherche suivante va retourner pointeur 
                              et on va boucler à l'infini)    
    Fin Tant que 
Fin Fonction

Tant qu'on lit une ligne
    (Ici, on peut supprimer le \n de la ligne en le remplaçant par un 0 si on veut)
    ChercherMotDansLigne(mot, ligne)
Fin Tant que    
+0 -0
  • Il t’a fourni une fonction qui marche, et ce n’est pas sa faute si tu as suivi son conseil de travers. Je le sais je n’ai jamais dit que c’était de sa faute ou qu’il a fait une erreur. Au contraire je l’ai écouté car je sais que c’est quelqu’un de compétant et d’actif sur le forum d’openclassroom.

  • Merci Karnaj je vais refaire le code pour que ça soit plus clai, je te tiens au courant

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte