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 :

besoin d'un coup de pouce pour strcmp


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut besoin d'un coup de pouce pour strcmp
    bonjour et bonne année a tous ;°)

    comme le titre l'indique: je bloque! mais je +- débute donc je pense qu'il s'agit sûrement d'un problème grossier qui m'échappe.

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      char * mot = "";
      FILE * f;
     
      f = fopen("test","r");
      fscanf(f,"%s",&mot);
      fclose(f);
     
      if  (!strcmp(mot,"bonjour")) ... //me renvoie une erreur de segmentation.
    voilà! je vous assure que j'ai écopé les man pages sans trouver de réponse.
    je ne sais vraiment pas ou je me plante.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 17
    Par défaut
    ton init de "mot" est faite sur une chaine constante. Pour que ton code fonctionne il te faut plutot faire un malloc.
    Ensuite ton fscanf n'a pas besoin d'une reference sur mot:
    et sa fonctionnera mieux.

    Stef

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par echantillon
    bonjour et bonne année a tous ;°)

    comme le titre l'indique: je bloque! mais je +- débute donc je pense qu'il s'agit sûrement d'un problème grossier qui m'échappe.

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      char * mot = "";
      FILE * f;
     
      f = fopen("test","r");
      fscanf(f,"%s",&mot);
      fclose(f);
     
      if  (!strcmp(mot,"bonjour")) ... //me renvoie une erreur de segmentation.
    voilà! je vous assure que j'ai écopé les man pages sans trouver de réponse.
    je ne sais vraiment pas ou je me plante.
    mot est un pointeur vers une chaine constante.

    Tu commets donc 3 infractions entrainant un comportement indéfini :
    • Tu passes l'adresse d'un pointeur sur char alors que fscanf() avec "%s" attend l'adresse d'un char
    • Même si tu retires le '&'
      • Tu passes l'adresse du premier élément d'un tableau de char non modifiable (on ne peut donc pas écrire dedans)
      • Même si il était modifiable, ce tableau ayant une talle de 1, il ne peut recevoir autre chose qu'une chaine vide ("").

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Salut,

    Je pense que je ferais comme cela:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
        int i; /* indice de boucle */
        char s_mot[50];
        FILE *f;
     
        f = fopen("test", "r");
        /* On contrôle toujours la valeur de retour de fopen*/
        if (f == NULL)
        {
            fprintf(stderr, "Impossible d'ouvrir le fichier test!\n");
            exit(EXIT_FAILURE); 
        }
     
        /* fgets est la fonction de choix pour la saisie de chaînes de caractères*/
        fgets(s_mot, sizeof s_mot, f);
        fclose(f);
     
        for (i = 0; s_mot[i] != '\n' && s_mot[i] != '\0'; ++i)
        {
            continue; /* Le corps de la boucle est vide*/
        }
        if (s_mot[i] == '\0')
        {
            /* La saisie est incomplête: sizeof s_mot est insuffisant */
        }
     
        if  (!strcmp(s_mot, "bonjour"))
        {
            /* si s_mot contient la chaîne "bonjour" */
        }
        else
        {
            /* ... */
        }
     
        return EXIT_SUCCESS;
    }
    La fonction fscanf (et scanf) est une fonction exclusivement réservée aux experts, car très difficile à manipuler correctement. Pour une utilisation correcte de scanf et en particulier avec la saisie de chaîne de caractère, la lecture de ce tutoriel est fortement recommandée: http://xrenault.developpez.com/tutoriels/c/scanf/

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut
    Merci pour les réponse ;°)
    alors:

    =>Emmanuel :
    "Tu commets donc 3 infractions entrainant un comportement indéfini :"

    -..heu, me reste t' il des points sur mon permis de programmer !?


    "Même si il était modifiable, ce tableau ayant une talle de 1, il ne peut recevoir autre chose qu'une chaine vide ("") "

    -Ducoup, je ne devrais pas avoir le droit de faire ceci :
    char * p = "";
    p = "bonjour";
    ?
    pourtant gcc ne me dit rien et ça fonctionne .

    Sinon merci pour la clarté de ta réponse. je pense avoir définitivement compris mes erreurs précédentes.

    =>mujigka :
    Etant donné le nombre important de mots (une 100aine) dont je dois tester la présence dans mon fichier (je peux éventuellement vous donner des précisions sur mon prog) je crois que je vais quand même utiliser fscanf; tout en faisant très attention.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par echantillon
    "Même si il était modifiable, ce tableau ayant une talle de 1, il ne peut recevoir autre chose qu'une chaine vide ("") "

    -Ducoup, je ne devrais pas avoir le droit de faire ceci :
    char * p = "";
    p = "bonjour";
    ?
    pourtant gcc ne me dit rien et ça fonctionne .
    Ben oui, pourquoi on ne pourrait pas faire ça ? On peut faire pointer un pointeur n'importe où, du moment que le type est compatible et que la zone est valide...

    Tu confonds peut être avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char * p = "";
       strcpy (p, "bonjour");
    Ce qui est un comportement indéfini.

    Rappel : http://emmanuel-delahaye.developpez.com/notes.htm#ub

    Remarque. La zone pointée par p éant non modifiable, il est recommandé d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char const * p = "";
       strcpy (p, "bonjour");
    Là, un compilateur bien réglé devrait signaler le problème de types incompatibles, ce qui pourrait éviter une erreur...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut
    "Ben oui, pourquoi on ne pourrait pas faire ça ?"
    overdose de théine. désolé.

    La vrai raison c'est qu'il faut que je revoie les pointeur en c.
    Feu mon roulage de bosse en pointeurs pascalien dont je suit originaire (ha.. les belles années légos..) mais le c est plus coriace, j' eu été prévenu.

    Sinon voici la correction de mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char * mot = ""; mot = (char*)malloc(sizeof(char)*50);
      FILE * f;
     
      f = fopen("test","r");
      fscanf(f,"%s",mot);
      fclose(f);
     
      if  (!strcmp(mot,"bonjour")) system("echo bonjour");
    cette fois je pense que c'est bon.
    merci pour tout ;°)
    et rebonne année a vous tous;°))

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par echantillon
    Sinon voici la correction de mon code:
    Beaucoup de choses inutilement compliquées. Beaucoup de choses essentielles oubliées...
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main (void)
    {
       char const *fname = "test.txt";
       char *mot = malloc (sizeof *mot * 50);
     
       if (mot != NULL)
       {
          int err = 1;
          FILE *f = fopen (fname, "r");
     
          strcpy (mot, "");
     
          if (f != NULL)
          {
             err = fscanf (f, "%s", mot) != 1;
             fclose (f), f = NULL;
          }
          else
          {
             perror (fname);
          }
     
          if (!err)
          {
             if (strcmp (mot, "bonjour") == 0)
             {
                system ("echo bonjour");
             }
          }
          free (mot), mot = NULL;
       }
       return 0;
    }
    Pose des questions si tu ne comprends pas.

Discussions similaires

  1. [Batch] Besoin d'un coup de pouce pour un .bat
    Par rlelamer dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 23/04/2011, 00h48
  2. j'ai besoin du petit coup de pouce pour démarrer
    Par metou2703 dans le forum C++
    Réponses: 12
    Dernier message: 21/11/2008, 14h15
  3. [MySQL] Besoin d'un coup de pouce pour mon update
    Par oranocha dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/10/2007, 11h54
  4. [Fortran 95] Besoin d'un coup de pouce pour démarrer
    Par R_sponge dans le forum Fortran
    Réponses: 3
    Dernier message: 26/09/2007, 21h47
  5. Besoin d'1 coup de pouce pour realiser une importation de BD
    Par gizmorambo dans le forum Bases de données
    Réponses: 4
    Dernier message: 25/08/2005, 14h07

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