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 :

Boucle de saisie


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut Boucle de saisie
    Bonjour,
    Pourriez-vous me dire pourquoi ce petit programme ne fonctionne pas!
    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
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        int c;
          do
            {
              printf("Voulez-vous continuer?(O/N)\n");
              scanf("%c", &c);
            }
          while(c!='O' && c!='N' && c!='o' && c!='n');
        system("PAUSE");
        return EXIT_SUCCESS;
    }

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
    Pas du c.

    Sinon, on appelle scanf avec %c en type attendu, mais on fourni un pointeur sur int... qui n'a pas été initialisé.
    Si on voie l'int comme un tableau de 4 char, le premier est bien égal à la valeur tapée, mais le reste de l'int vaut n'importe quoi.

    Pourquoi ne pas utiliser un type char ?

    EDIT :
    Un code qui fonctionne :
    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
    #include <stdlib.h>
    #include <stdio.h>
     
    int main(void)
    {
        char c;
          do
            {
              printf("Voulez-vous continuer?(O/N)\n");
              scanf("%c", &c);
              /* il faudrait purger stdin ici */
            }
          while(c!='O' && c!='N' && c!='o' && c!='n');
        return EXIT_SUCCESS;
    }
    Remarque : on peut (et souvent conseillé) d'utiliser plutôt fgetc.

    Remarque 2 : system("pause"); n'est pas portable : je suis sous windows, pourtant,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sh: PAUSE: command not found
    Remarque 3 : gcc dit bien qu'il y a un truc de louche : il ne faut pas ignorer ce qu'il dit, c'est souvent plein de bon sens.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    08-11-13-1.c: In function `main':
    08-11-13-1.c:11: warning: char format, different type arg (arg 2)
    08-11-13-1.c:11: warning: char format, different type arg (arg 2)
    Dernière modification par Invité(e) ; 13/11/2008 à 16h51.

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut
    C'est bon, ça fonctionne!
    Pour ce qui n'est pas du C, c'est ce qu'il y a sur la fenêtre quand je démarre le logiciel: c'est du C++ je présume non?

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par yo_haha Voir le message
    c'est du C++ je résume non?
    Oui.
    D'ailleurs, en c++, il ne faut pas utiliser les fonction de c standard, mais les classes définies dans iostream : cout et cin, mais c'est une autre histoire.

    Citation Envoyé par yo_haha Voir le message
    c'est ce qu'il y a sur la fenêtre quand je démarre le logiciel
    Lequel par curiosité ?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Oui, c'est du code C++.

    Pour compiler en C, vérifie aussi que l'extension de ton fichier source est bien .c (en minuscule). Et encore, dans des EDIs comme Dev-C++ et Code::blocks; c'est souvent que ça ne suffit pas et qu'il faut en plus trifouiller les options du projet pour qu'il accepte *enfin* de compiler en tant que C...

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par mabu Voir le message
    Oui.
    D'ailleurs, en c++, il ne faut pas utiliser les fonction de c standard, mais les classes définies dans iostream : cout et cin, mais c'est une autre histoire.


    Lequel par curiosité ?
    DevC++
    Pour include<stdlib> il renvoit le message suivant: "no such file or directory"

  7. #7
    Invité(e)
    Invité(e)

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par mabu Voir le message
    Sinon, on appelle scanf avec %c en type attendu, mais on fourni un pointeur sur int... qui n'a pas été initialisé.
    Pourriez-vous m'expliquer un peu plus (je suis débutant).
    Citation Envoyé par mabu Voir le message
    Si on voie l'int comme un tableau de 4 char, le premier est bien égal à la valeur tapée, mais le reste de l'int vaut n'importe quoi.
    Pourquoi ne pas utiliser un type char ?
    Si on met char on pourrait aussi le voir comme tableau de 4 char et le phénomème que vous venez de citer devrait avoir lieu. Mais ce n'est pas le cas, pourquoi?
    Pourquoi on peut voir int comme tableau de char alors qu'on a déclaré un entier et pas un tableau et encore moins un tableau de char.

    Citation Envoyé par mabu Voir le message
    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
    #include <stdlib.h>
    #include <stdio.h>
     
    int main(void)
    {
        char c;
          do
            {
              printf("Voulez-vous continuer?(O/N)\n");
              scanf("%c", &c);
              /* il faudrait purger stdin ici */
            }
          while(c!='O' && c!='N' && c!='o' && c!='n');
        return EXIT_SUCCESS;
    }
    char est chaîne de caractères, donc lue par %s non?
    Pourquoi faut-il purger stdin? (avec fflush non?)
    Avec getc on ne purge pas stdin?
    C'est getc ou bien getch ou bien gets ...????

    Citation Envoyé par mabu Voir le message
    Remarque 2 : system("pause"); n'est pas portable : je suis sous windows, pourtant,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sh: PAUSE: command not found
    Je ne comprends pas ce que vous voulez dire.

  9. #9
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par yo_haha Voir le message
    Sinon, on appelle scanf avec %c en type attendu, mais on fourni un pointeur sur int... qui n'a pas été initialisé.
    Pourriez-vous m'expliquer un peu plus (je suis débutant).
    Lorsqu'on utilise scanf, par le premier paramètre, on lui donne la forme des données attendues.

    Exemple : %d dit qu'on attend un entier (int), %c un caractère (char).

    Les paramètres suivants de scanf sont des pointeurs qui sur des variables où scanf va écrire les données décodées. Ainsi, dans le code suivant, scanf va écrire l'entier qu'il vient de lire à l'emplacement de i qui est un entier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i;
    scanf("%d", &i);
    En revanche, si on écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i;
    scanf("%c", &i);
    scanf va stocker un char dans une variable entière. Or un char est en général plus petit (1) qu'un int. Sur x86, c'est souvent char de 8 bits et int de 32 bits.
    Que fait scanf ? il a 8 bits à écrire, il commence donc à remplir les 8 premiers bits de la variable entière, mais ne touche pas aux 24 derniers bits.
    Après l'appel de scanf, 24 bits sur 32 dans notre entier valent donc n'importe quoi.

    scanf n'est pas une fonction évidente, il est préférable de lui préférer fgetc ou getchar.

    Citation Envoyé par yo_haha Voir le message
    char est chaîne de caractères, donc lue par %s non?
    Non char est un char, une chaine de caractère est un tableau de char terminée par un zero.
    Citation Envoyé par yo_haha Voir le message
    Pourquoi faut-il purger stdin? (avec fflush non?)
    Quand on entre une lettre au clavier puis qu'on valide avec la touche entrée, stdin contient de touche pressée, suivit du caractère fin de ligne ('\n').
    Il faut donc vider stdin pour vider ce qui n'a pas été lu par scanf, et qui pourrait polluer la prochaine lecture par scanf.
    Citation Envoyé par yo_haha Voir le message
    Avec getc on ne purge pas stdin?
    C'est getc ou bien getch ou bien gets ...????
    Non, getc récupère un char du flux donné.
    getch n'est pas standard.
    gets ne doit pas être utilisé
    Citation Envoyé par yo_haha Voir le message
    Remarque 2 : system("pause"); n'est pas portable.
    Je ne comprends pas ce que vous voulez dire.
    Je veux dire que chez moi, quand je lance le programme depuis un terminal, quand le programme arrive à l'instruction "system("PAUSE");", mon système me dit que cette fonction (pause) n'existe pas.


    (1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(char) <= sizeof(short) <= sizeof(int)

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Points : 90
    Points
    90
    Par défaut
    Je vous remercie infiniment pour vos explications.
    Encore un petit problème:
    Quand j'utilise getchar voici ce qui s'affiche " too many arguments to function `int getchar()' "
    Quand j'utilise fgetc " invalid conversion from `char' to `FILE*' "

  11. #11
    Invité(e)
    Invité(e)
    Par défaut
    Réponse dans le man :
    http://man.developpez.com/man3/fgets.3.php

    La faq peut être utile aussi.

Discussions similaires

  1. Boucle de saisie de chaines de caractères
    Par mailbox dans le forum Débuter
    Réponses: 8
    Dernier message: 13/11/2010, 12h52
  2. Problème boucle et saisie de char
    Par Setsuna_00 dans le forum Débuter
    Réponses: 5
    Dernier message: 09/04/2010, 18h50
  3. scanf : utilisation dans une boucle de saisie
    Par kromartien dans le forum Bibliothèque standard
    Réponses: 4
    Dernier message: 03/12/2007, 23h50
  4. Programmer une boucle de saisie chaine de caractère.
    Par Spike Spiegel dans le forum C
    Réponses: 30
    Dernier message: 02/10/2005, 17h46
  5. Réponses: 6
    Dernier message: 17/06/2005, 16h51

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