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 sur fonction strcmp


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Probleme sur fonction strcmp
    Bonjour,

    on a un probleme sur ce morceau de 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
    void ajouterPanne()
    {
    
    	int nbMachines;
    	int i = 1;
    	Pannes* nouvellePanne;
    	char lecture[11];
    	int trouve=0;
    	char nomMachine[11];
    
    
            while (trouve == 0)
    	{
    		FILE *machine = fopen("data\\machine.txt", "rt");
    		fgets( lecture , 4,  machine ); 
    		sscanf(lecture, "%d", &nbMachines);
    		puts("Entrez le nom de la machine");
    		scanf("%s", &nomMachine);
    		do
    		{
    			fgets( lecture, 10,  machine);
    			if( strcmp(nomMachine, lecture) == 0) trouve = 1;
    			i++;
    		}while (trouve == 0 && i < nbMachines);
    
    		if(trouve == 0 ) puts("nom de machine incorrect");
    
    		fclose (machine);
    
    	}
    }
    l'utilisateur doit entrer un "nomMachine", et ce "début de fonction" essaye de trouver si le ce nom en question appartient a une liste de machine précisée dans le fichier machine.txt
    forme du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    5 //nombre de nom de machines dans le fichier
    machine1
    machine2
    machine3
    machine4
    machine5
    il semble que ca soit la ligne en rouge qui pose un probleme étant donné que trouve garde la valeur 0 à la fin de l'execution.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Moi je penche pour le fait que le fgets prend le \n et pas le scanf en bref tu compare
    machine1\n\0
    et
    machine1\0

    Apres ton fgets met un
    machine[strlen(machine)-1] = '\0';
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Invité
    Invité(e)
    Par défaut
    MERCI !!! MERCI !!
    On t'aime !!!

    signé : les desespérés du C un soir de semaine sur un projet de ~[#|~~`{

    Mis fu & Raoul


    ps: si on a d'autres question, nous reviendrons les poser sur ce même post.

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    L'habitude avec un fgets est plutôt de travailler comme ça :
    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
    void ajouterPanne()
    {
     
       int nbMachines;
       int i = 1;
       Pannes* nouvellePanne;
       char lecture[11];
       int trouve=0;
       char nomMachine[11];
     
     
       while (trouve == 0)
       {
          FILE *machine = fopen("data\\machine.txt", "rt");
          fgets( lecture , 4,  machine );
          sscanf(lecture, "%d", &nbMachines);
          puts("Entrez le nom de la machine");
          scanf("%s", nomMachine);
          while (trouve == 0 && i < nbmachines &&
                    fgets( lecture, 10,  machine) != NULL)
          {
             // on efface le '\n'
             char *p = strchr(lecture, '\n');
             if (p != NULL)
                 *p = 0;
             else
             {
                 // ici problème, le buffer de lecture est trop petit
                 // a toi de voir si c'est utilise
             }
             if( strcmp(nomMachine, lecture) == 0) 
                trouve = 1;
     
             i++;
          }
          if(trouve == 0 ) 
             puts("nom de machine incorrect");
     
          fclose (machine);
     
       }
    }
    On peut se poser la question "pourquoi ouvres-tu et refermes tu le fichier à chaque boucle sur trouve == 0 ?
    As-tu une bonne raison de mémoriser le nombre de machines enregistrées ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci de ta réponse, on va tester ça...
    cependant, on préfère utiliser les fonctions que l'on connait déjà (qu'on a appris en cours en gros) plutot que d'utiliser ce strchr que l'on n'a pas encore vu.

    mais on va creuser ta solution.

  6. #6
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Merci de ta réponse, on va tester ça...
    cependant, on préfère utiliser les fonctions que l'on connait déjà (qu'on a appris en cours en gros) plutot que d'utiliser ce strchr que l'on n'a pas encore vu.
    Alors soit vous les utilisez correctement (allez : une fonction que vous utilisez n'importe comment, au hasard... :
    **roulements de tambours**
    scanf : & en trop, taille saisie, retour de la fonction... bref, toujours la même chose...), soit vous utilisez tout au long de votre code les fonctions de saisies correctes pour des débutants : fgets.

    Surtout que comme vous utilisez déjà fgets, je ne vois pas pourquoi vous mélangez ses appels avec scanf...
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  7. #7
    Invité
    Invité(e)
    Par défaut
    On ne comprend pas trop ta remarque Pouic... quel est le rapport entre le scanf et le fgets?


    sinon on a une autre question. En compilant on obtient toujours un warning de la forme : warning C4022: 'fread' : pointer mismatch for actual parameter 1

    sur la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(panneCourante->mois, sizeof(int), 1, listePanne);
    ainsi que toutes celles s'apparantant (celles utilisant sizeof(int), celles en sizeof(char) ne posant aucun problème)

    C'est la première fois que l'on utilise ce type de fonctions donc on le moindre soucis et on est paumé...

  8. #8
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    On ne comprend pas trop ta remarque Pouic... quel est le rapport entre le scanf et le fgets?
    Le rapport est que pour récupérer l'entrée standard (saisie utilisateur), vous devriez utiliser fgets.

    sinon on a une autre question. En compilant on obtient toujours un warning de la forme : warning C4022: 'fread' : pointer mismatch for actual parameter 1

    sur la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(panneCourante->mois, sizeof(int), 1, listePanne);
    ainsi que toutes celles s'apparantant (celles utilisant sizeof(int), celles en sizeof(char) ne posant aucun problème)

    C'est la première fois que l'on utilise ce type de fonctions donc on le moindre soucis et on est paumé...
    Sans la définition de la structure Panne, on va avoir du mal à voir...
    Mais je subodore le fait que mois soit un entier : si vous aviez lu la doc de fread, vous vous seriiez rendu compte que le premier parametre de fgets est sensé être un pointeur...
    Donc c'est
    &panneCourante->mois
    qu'il faut passer.
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  9. #9
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut Re: Probleme sur fonction strcmp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          fgets( lecture , 4,  machine );
    [...]
          scanf("%s", &nomMachine);
    Tu as de la chance... tu ferais l'inverse (sscanf puis fgets...) tu ne comprendrait pas "Pourquoi le programme me laisse pas taper le nom de la machine ?"... [1]

    Bonne résolution pour 2006 : banir scanf



    Citation Envoyé par Skyrunner
    Apres ton fgets met un
    machine[strlen(machine)-1] = '\0';
    Peut être dangereux... Il faut vérifier que le caractère est un '\n', sinon, c'est que le buffer est plein, et on perd le dernier caractère lu !

    -- edit --
    [1] D'ailleurs je parie qu'il y avais deux scanf avant et que le premier à été remplacé par un fgets parceque le comportement n'était pas celui prévu ... Je me trompe ?

    Smortex

    Les FAQ Assembleur - Linux
    In The Beginning Was The Command Line Neal Stephenson

Discussions similaires

  1. [XL-2010] Probleme sur Fonction Split
    Par Jeyjey1 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/07/2011, 14h48
  2. Probleme sur fonction TRANSLATE
    Par chonch dans le forum PL/SQL
    Réponses: 3
    Dernier message: 21/05/2010, 15h04
  3. probleme sur fonction fwrite
    Par gijy dans le forum Bibliothèque standard
    Réponses: 32
    Dernier message: 13/01/2008, 07h28
  4. Probleme sur une fonction
    Par dederfred dans le forum Delphi
    Réponses: 1
    Dernier message: 06/10/2006, 16h58
  5. Probleme sur une fonction vérif
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/10/2004, 13h25

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