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 :

la command getchar


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut la fonction getchar()
    Bonjours,

    Je débute dans la programmation et je rencontre une difficulté avec Dev-C++.
    Je suis censé faire un programme devant effectuer une tâche de comptabilisée et au lieu de ça une fois le programme lancé celui-ci me recopie exactement les entrées du clavier au lieu de les comptabiliser.


    voici le programme:

    Code c++ : 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
    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    /* compte de caractères en entrée; 1er version*/
    int main(int argc, char *argv[])
    {
        long nc;
     
        nc = 0;
        while(getchar() != EOF)
                        ++nc;
                        printf("%ld\n", nc);
     
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }

    et ce qu'il ce passe dans la commande quand le programme est exécuté:

    sdvsdvsdvs0.30f

  2. #2
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Normal, c'est ce que tu saisis qui est affiché.
    Pour avoir le compte final il faut faire un Ctrl+D.
    Mais le problème c'est que tu comptabilises aussi les retours chariots et le Ctrl+D.

    Essaye ceci, ça devrait mieux marcher.

    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
    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        long nc;
        char c;
     
        nc = 0;
        while(c != EOF)
        {
           c = getchar();
     
           if(c != '\n' && c != EOF)
             nc++;
         }
     
          printf("%ld\n", nc);
     
     
       // system("PAUSE");
        return EXIT_SUCCESS;
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut ça ne marche pas
    Je viens tester que tu ma dis et je ne constate aucune différence déplus le bout de programme que j'ai montré viens d'un livre qui me dis que ce programme ne fais que comptabilisé les entrée. Pourrais tu bien m'expliquer ce qu'est getchar et trouver une solution a ce problème sa serai super merci.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Il est bizarre qu'un bouquin C++ utilise les entrées sorties à la C

    Ceci étant, il faut terminer ta suite de caractères par le caractère représentant EOF pour que le nombre de caractères tapés s'affiche (le caractère représentant EOF ne sera pas compté par ton code, ce qui est normal) . Ce caractère dépend de ton système. Si tu es sous Windows, ce caractère est CTRL z.

    Tu dois donc taper tes caractères puis le caractère correspondant à EOF, puis terminer la ligne (return) pour que ce nombre s'affiche.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut je ne vois pas la comptabilisation
    Pour que la fenêtre ce ferme je dois faire entrée et ^z puis entré mais je n’ai aucune comptabilisations qui apparait.
    Sais tu pourquoi?

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Il n'y a aucune raison qui impose de faire <entrée> avant le caractère EOF (sur le code posté)
    Le system("PAUSE") est là pour éviter que la fenêtre ne se ferme avant de pouvoir lire ce qui est affiché à la console.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut oui,exact mais
    bas le system pause ne marche pas dans ce cas de figure est-ce du a cev-c++?

  8. #8
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Que se passe-t il quand tu le lances ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut ce qu'il se passe un foi lancé
    Alors quand je le lance le programme celui-ci me recopie seulement les entrées et il se femre après avoir entré ^z et entré. Je suis obligé de faire comme ça sinon ça ne marche pas j'ai essayer.

  10. #10
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Si tu es sous linux, fais Ctrl+D.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut re:
    je suis sous windows donc a ce kon ma dis c'est ^z.mon livre pour apprendre ce langage est LE LANGAGE C édition DUNOD. Si sa peux t'aider
    Merci de ton aide en tout cas

  12. #12
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    OK. Je résume :
    Tu as copié le code j'ai posté plus haut, tu la compilé, puis executé.
    Tu as saisi des caractères et explique moi qu'est ce qui se passe chez toi
    ensuite.

    Un exemple de ce qui devrait ce passer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    azer\n   // \n est pour la touche Entrer
    ty\n
    Ctrl+Z
    6                     // nombre de caracteres saisis au total

  13. #13
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    salut, si j'ai bien compris que tu travail sur le language C.
    alors j'ai pas mal de remarques concernant ton code:

    1) tu est sur C alors pas la peine d'invoquer la biblio iostreams ni d'utilisre le namsapce. (stdio tu suffit)

    2) tu travail avec les arguments de main (argc et argv) se sont des arguments utilisés pour l'execution sous dos (arc=nombre d'argument entrées , argv[]=valeur des argument entrée), si tu pas 'executer sous dos utilise main avec (void).

    3) main ettant entier pour toi, elle devra returnée un entier(ex:return 0) si nnon met la void (ex:void main())

    4)le condition d'arret de ta boucle while , tu utilise EOF(end of file =c'est la marque de fin fe fichier) or tu travail pas avec un fichier, essai de mettre une condition plus simple (ex: j'arrete en tappant un carractere ou chiffre que je choisi)

    5) on utilise nc++ pas ++nc ( pre_incrementation et post_incrementation)

    6)systeme ("pause") marche bien avec stdio, sinnon essai getch() avec la biblio conio.h
    Rq(sous le devc++ si getch() ne marche pas avec conio.h essai conio.c)


    je croie que c'est tout, j'espere apporter un peu d'aide.
    bon courage.

  14. #14
    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 8L4CK8ird Voir le message
    voici le programme:
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    Pas du C. Je déplace ?

  15. #15
    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 8L4CK8ird Voir le message
    mon livre pour apprendre ce langage est LE LANGAGE C édition DUNOD. Si sa peux t'aider
    Pas de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    dans ce livre. Tu fais n'importe quoi...

    ceci 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
    16
     
    #include <stdio.h>
     
    int main (void)
    {
       int c;
       int n = 0;
     
       while ((c = getchar ()) != EOF)
       {
          n++;
       }
     
       printf ("%d caractere(s) tape(s)\n", n);
       return 0;
    }
    Sous Windows, il faut taper Ctrl-Z après un <enter> et taper enter après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    hello world
    ^Z
    12 caractere(s) tape(s)
     
    Process returned 0 (0x0)   execution time : 11.066 s
    Press any key to continue.

  16. #16
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par wakaa3lik Voir le message
    2) tu travail avec les arguments de main (argc et argv) se sont des arguments utilisés pour l'exécution sous dos (arc=nombre d'argument entrées , argv[]=valeur des argument entrée), si tu pas 'exécuter sous dos utilise main avec (void).
    L'utilisation des arguments argc et argv de main n'a rien a voir avec DOS. Il s'agit d'une des formes standards de main(), cette forme permet de fournir des paramètres au programme.

    Elle fonctionne aussi bien sous DOS que sous Linux, Windows, UNIX, etc.

    Citation Envoyé par wakaa3lik Voir le message
    3) main etant entier pour toi, elle devra retourner un entier(ex:return 0) sinon met la void (ex:void main())
    Non, on n'utilise pas void main(void) en effet ce n'est pas une forme de main standard et pourrais très bien ne pas fonctionner. Même si elle fonctionne dans un environnement particulier, le programme n'est alors plus portable sans raison valable.

    Il faut faire renvoyer une valeur par main. Si cette valeur est "sans importance", je recommande EXIT_SUCCESS.

    Citation Envoyé par wakaa3lik Voir le message
    4)le condition d'arrêt de ta boucle while , tu utilise EOF (end of file =c'est la marque de fin de fichier) or tu travail pas avec un fichier, essai de mettre une condition plus simple (ex: j'arrête en tapant un caractère ou chiffre que je choisi)
    Vu du C, stdin est un flux comme un autre et peut très bien correspondre à un fichier. Même s'il est lié au clavier, il existe une combinaison de touches permettant d'envoyer un EOF.

    Mais il est vrai qu'il peut être plus simple, pour un test de ce type, d'utiliser une autre condition de sortie de la boucle (par exemple tout simplement la validation de la saisie par ENTER).

    Citation Envoyé par wakaa3lik Voir le message
    5) on utilise nc++ pas ++nc ( pre_incrementation et post_incrementation)
    Les deux formes sont valides et correctes et peuvent donc être utilisées.

    La première (nc++) est par contre généralement plus facile à lire.

    Il y a eu une époque pas si lointaine que ça où la seconde forme était fréquemment utilisée pour des soucis d'optimisation. Avec un compilateur récent, il ne devrait plus y avoir de différence.

    Citation Envoyé par wakaa3lik Voir le message
    6)systeme ("pause") marche bien avec stdio, sinon essai getch() avec la biblio conio.h
    Rq (sous le devc++ si getch() ne marche pas avec conio.h essai conio.c)
    Non, on n'inclue pas un .c dans un autre. On inclue uniquement des fichiers d'entête.
    Le problème fréquemment rencontré avec l'utilisation de conio sous devC++ ne se régle pas en incluant conio.c dans les fichiers sources mais en incluant conio.h et en rajoutant conio.c au projet.

  17. #17
    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 wakaa3lik Voir le message
    je croie que c'est tout, j'espere apporter un peu d'aide.
    bon courage.
    Euh, pas vraiment... Déjà, c'est plein de fautes de frappes et de français...

    ensuite :
    2) tu travail avec les arguments de main (argc et argv) se sont des arguments utilisés pour l'execution sous dos (arc=nombre d'argument entrées , argv[]=valeur des argument entrée), si tu pas 'executer sous dos utilise main avec (void).
    Le C ne sait pas ce qu'est le 'DOS'. Parle plutôt de 'mode commande'

    3) main ettant entier pour toi, elle devra returnée un entier(ex:return 0) si nnon met la void (ex:void main())
    main() retourne un int. Toujours.
    4)le condition d'arret de ta boucle while , tu utilise EOF(end of file =c'est la marque de fin fe fichier) or tu travail pas avec un fichier, essai de mettre une condition plus simple (ex: j'arrete en tappant un carractere ou chiffre que je choisi)
    stdin est un flux. Pour silmuler EOF, on fait

    unixoide : ctrl-d
    windows : ctrl-z<enter> après un <enter>


    5) on utilise nc++ pas ++nc ( pre_incrementation et post_incrementation)
    Aucune importance ici.

    6)systeme ("pause") marche bien avec stdio, sinnon essai getch() avec la biblio conio.h
    Rq(sous le devc++ si getch() ne marche pas avec conio.h essai conio.c)
    system("pause"); n'a rien à voir avec <stdio.h>. system() est déclarée dans <stdlib.h>. La commande passée dépend du système.
    <conio.h> n'est pas standard.
    on inclue pas de .c

    La bonne alternative est getchar() à condition que le flux stdin soit bien vide.

    bon, ben grillaid...

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut Re: Emmanuel Delahaye
    Merci de votre aide,

    Je viens de faire un bête copier collé du programme que tu m'a mis et surprise en suivant tes instructions cela ne marche pas, ce problème ne serais pas dû à mon outils DEV-C++ et a son compilateur?
    Car je ne vois que hello world mon CRTL-Z et la fenêtre ce ferme sans m'aficher le reste des instruction comme le nombre de caractère tapé et ce qui suit.

  19. #19
    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 8L4CK8ird Voir le message
    Je viens de faire un bête copier collé du programme que tu m'a mis et surprise en suivant tes instructions cela ne marche pas, ce problème ne serais pas dû à mon outils DEV-C++ et a son compilateur?
    Car je ne vois que hello world mon CRTL-Z et la fenêtre ce fe
    Apparemment, tout se ferme trop vite chez toi !

    Puisque tu es sous Dev-C++, ajoute system("pause"); a la fin (avant le return 0

    Sinon, je conseille Code::Blocks qui fait la pause tout seul en mode IDE.

    (je rappelle que Dev-C++ n'est plus maintenu depuis 2 ans).

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Par défaut c bon cela marche
    Je ne met pas cette discussion résolu car je vais essayer de bien comprendre le fonctionnement avant une foi que j'aurai compris je le mettrai résolu merci de ton aide!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Interception des commandes in et out
    Par KDD dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 18/12/2002, 16h55
  2. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  3. [Kylix] Commandes linux ss kylix
    Par csnickos dans le forum EDI
    Réponses: 3
    Dernier message: 15/09/2002, 20h24
  4. Réponses: 3
    Dernier message: 02/09/2002, 18h49
  5. Réponses: 2
    Dernier message: 11/08/2002, 21h27

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