Correction code en C

a marqué ce sujet comme résolu.
Auteur du sujet

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 ;)

Édité par Taurre

+0 -0

Salut ! :ange:

Serait-il possible que tu mettes ton code dans un bloc code correctement comme tu as essayé de le faire pour que l’on puisse t’aider ? De plus, tu parles d’erreurs : pourrais-tu nous les fournir ?

Zestement :magicien:

+1 -0

Cette réponse a aidé l’auteur du sujet

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.

Assez des salamis, je passe au jambon — Je fais un carnage si ce car nage car je nage, moi, Karnaj ! — Le comble pour un professeur de mathématique ? Mourir dans l’exercice de ses fonctions.

+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.

Édité par MichelBillaud

+0 -0
Auteur du sujet

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

Édité par HelpMe

+0 -0

Cette réponse a aidé l’auteur du sujet

Regarde le type de fichier dans ta fonction chercher_mot.

Assez des salamis, je passe au jambon — Je fais un carnage si ce car nage car je nage, moi, Karnaj ! — Le comble pour un professeur de mathématique ? Mourir dans l’exercice de ses fonctions.

+1 -0
Auteur du sujet

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 :(

Édité par HelpMe

+0 -0

Cette réponse a aidé l’auteur du sujet

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.

Édité par Karnaj

Assez des salamis, je passe au jambon — Je fais un carnage si ce car nage car je nage, moi, Karnaj ! — Le comble pour un professeur de mathématique ? Mourir dans l’exercice de ses fonctions.

+0 -0
Auteur du sujet

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

Édité par HelpMe

+0 -0

Cette réponse a aidé l’auteur du sujet

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) ?

Assez des salamis, je passe au jambon — Je fais un carnage si ce car nage car je nage, moi, Karnaj ! — Le comble pour un professeur de mathématique ? Mourir dans l’exercice de ses fonctions.

+0 -0
Auteur du sujet

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'

Édité par HelpMe

+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.

Assez des salamis, je passe au jambon — Je fais un carnage si ce car nage car je nage, moi, Karnaj ! — Le comble pour un professeur de mathématique ? Mourir dans l’exercice de ses fonctions.

+0 -0
Auteur du sujet

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 :(

Édité par HelpMe

+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 ?

Édité par MichelBillaud

+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    

Assez des salamis, je passe au jambon — Je fais un carnage si ce car nage car je nage, moi, Karnaj ! — Le comble pour un professeur de mathématique ? Mourir dans l’exercice de ses fonctions.

+0 -0
Auteur du sujet
  • 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

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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