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 :

utilisation de fgets: une question


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut utilisation de fgets: une question
    j'ai donc décidé de reprendre tous mes codes et de remplacer tous mes scanf par des fgets. je suis en train d'écrire un traducteur anglais-français (enfin, modeste). or j'ai un souci avec l'utilisation de fgets:

    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
     
     
    char choix[3]
    ....
     
    while (k==0) {              
           printf("\nvoulez-vous ajouter un autre mot ? o/n : ");
           if (fgets (choix, sizeof choix, stdin) != NULL) {
                       char *p = strchr (choix, '\n');
                       if (p){*p = 0;}}
           printf("%s",choix); /* rajouté pour essayer de comprendre*/
           if (choix=="n") {printf("implémentation terminée");fclose(base);k=1;fin=1;} 
           else if (choix=="o") k=1;
           else {printf("erreur : réponse non valide !\n");k=0;}
    }
    la fonction printf("%s",choix) me renvoie bien "n" ou "o", mais la boucle if m'écrit toujours "réponse non valide".

    quelqu'un a une idée ?

    j'ajouterais que quand je lui demande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    printf("choix 0 \'%c\' choix 1 \'%c\' choix 2 \'%c\'",choix[0],choix[1],choix[2]);[quote]
     
    il m'écrit: '0' ' ' ' ' .
     
    je ne comprends pas.[/quote]

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    La comparaison de chaine de caracteres se fait avec strcmp() et non avec ==.
    Ou bien tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(strcmp(choix, "n") == 0)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(choix[0] == 'n')

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: utilisation de fgets: une question
    Citation Envoyé par artatum
    j'ai donc décidé de reprendre tous mes codes et de remplacer tous mes scanf par des fgets. je suis en train d'écrire un traducteur anglais-français (enfin, modeste). or j'ai un souci avec l'utilisation de fgets:
    Je conseille de construire une fonction de lecture de ligne solide et fiable à partir de fgets() (ou de fgetc())

    [C'est ça qu'on devrait apprendre à faire dans les cours de C pour débutant...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char choix[3]
    ....
     
    while (k==0) {              
           printf("\nvoulez-vous ajouter un autre mot ? o/n : ");
           if (fgets (choix, sizeof choix, stdin) != NULL) {
                       char *p = strchr (choix, '\n');
                       if (p){*p = 0;}}
    Ok, au moins tu as lu la doc...
    printf("%s",choix); /* rajouté pour essayer de comprendre*/
    if (choix=="n")
    ben non.
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           if (strcmp (choix), 'n') == 0)
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    oui, la doc est mieux expliquée que les bouquins qui restent assez sommaires sur le sujet de la fin de chaîne.

    merci beaucoup des réponses

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par artatum
    oui, la doc est mieux expliquée que les bouquins qui restent assez sommaires sur le sujet de la fin de chaîne.
    C'est à dire que le "sujet de la fin de chaîne" est des plus sommaires :

    "Une chaine est un tableau de char terminé par un 0."

    Rien de plus, rien de moins. Si ton bouquin ne dit pas ça au debut du chapitre sur les chaines, brûle le.

    Exemples :

    http://publications.gbdirect.co.uk/c_book/chapter9/string_handling.html
    In C, a string is an array of characters terminated by a null
    ou
    http://clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C/node32.html#SECTION00414000000000000000
    Le langage C fait la distinction entre tableau de caractères et chaîne de caractères : une chaîne de caractères est un tableau de caractères dont la fin est indiquée par un caractère null. C'est une convention très pratique exploitée par la bibliothèque standard.
    Il n'y a pas grand chose à ajouter, à part que dans les deux cas, le terme 'caractère' est mal choisi car il s'agit bel et bien d'un tableau de char (le type caractère ou character n'existe pas en C)...[1]

    ---------------------
    [1] Et pour ne rien arranger, la constante caractère en C a le type int!
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    voilà, comme ça ça marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((strcmp (choix, "n")) == 0)
    merci encore

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/04/2009, 23h01
  2. Est-ce une bonne utilisation de fgets ?
    Par clampin dans le forum C
    Réponses: 8
    Dernier message: 04/07/2007, 12h01
  3. Réponses: 2
    Dernier message: 22/04/2006, 18h18
  4. Une question à propos des thread
    Par tscoops dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/11/2003, 14h03
  5. [] Utiliser AVI d'une DLL dans mon programme
    Par seb.49 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/05/2003, 14h52

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