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 :

[K&R] Copie entrée sur sortie


Sujet :

C

  1. #1
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut [K&R] Copie entrée sur sortie
    Salut,

    dans le Kernighan & Ritchie, il y a le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <stdio.h>
     
    main()
    {
       int c;
     
       while ((c = getchar()) != EOF)
          putchar(c);
    }
    Ce code redirige donc l'entrée au clavier sur l'ecran. J'ai donc recopié ce code et compilé pour tester. Si je tape :
    salut
    au clavier : ça m'écrit bien
    salut
    à l'ecran mais dès que je fais Entrée, il me reécrit "salut" une deuxième fois à la ligne
    J'ai fais quelque chose de mal ?
    Ce phénomène m'embête un peu car je ne peux pas faire les exos plus interessants...
    Je precise que je compile avec Visual (projet console .c )
    Merci pour vos réponses

  2. #2
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    La condition (EOF) n'est pas valide à mon avis pour une entrée clavier.
    Mais je n'ai pas compris ton problème.
    Si t'entres "salut", quand t'appuie sur [entrer], c'est normal que ça t'affiche une nouvelle fois "salut" puisque getchar() est bufferisée.
    Tout ce que tu rentres va dans le buffer. Ce n'est pas le putchar() qui provoque l'affichage en temps réel...
    Pour faire ce que tu veux, c'est plutot getch() qu'il te faut. Enfin d'après ce que j'ai compris...

    Nas'

  3. #3
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Je n'ai fait que recopié le code du bouquin

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 20
    Par défaut
    salam

    D'aprés mon raisonnement.

    Tu saisies un caractéres qui va donc etre stocké dans le buffer ensuite tu affiches ce carartere ( ce qui ne vide pas le buffer ) et ainsi de suite donc quand tu as saisies entierement le mot 'salut' tu as bien affiché 'salut' a l'ecran mais dans le buffer est stocké 'salut' ( oui car putchar ne vide pas le buffer)

    Et donc quand tu tapes enter en fait le caractere \n a pour consequence de vide le buffer donc ca l'affiche a l'ecran.


    Mais ce raisonnement est bon si effectivement le buffer cité est celui de l'ecran... ce qui pose probleme car il s'agirait plus le buffer clavier qui serait concerné par la saisie...

    A l'aide !!!!

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    Je ne comprends pas la question....

    Tu entres "s a l u t" au clavier. (je simplifie en ignorant les caracteres comme \n...)
    C'est stocké dans un buffer (au moment de la frappe sur <enter> ).
    getchar arrive derriere et lit s, puis a, puis l, puis u, puis t (puis '\n').
    et pour chaque caractere lu par getchar, le putchar l'affiche à l'ecran.
    donc avec le code suivant :
    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()
    {
      int c;
     
      printf("saisie: \n");
      while ((c = getchar()) != EOF){
        printf("sortie : ");
        putchar(c);
        printf("\n");
      }
     
      return 0;
    }
    tu obtiens :
    $ ./a.out
    saisie:
    salut
    sortie : s
    sortie : a
    sortie : l
    sortie : u
    sortie : t
    sortie :
    (dernier blanc du au '\n' )
    voila...
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  6. #6
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Si je fais au clavier : "salut" puis Entrée, l'ecran :
    salut
    salut

    Le probleme c'est que l'exercice suivant demande de compter les caractères, j'ai peur qu'il me compte 2 "a" par exemple...en plus dans le bouquin il ne parle pas de ce "probleme"

  7. #7
    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 Re: [K&R] Copie entrée sur sortie
    Citation Envoyé par sorry60
    dans le Kernighan & Ritchie, il y a le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <stdio.h>
     
    main()
    {
       int c;
     
       while ((c = getchar()) != EOF)
          putchar(c);
    }
    Ce code redirige donc l'entrée au clavier sur l'ecran. J'ai donc recopié ce code et compilé pour tester. Si je tape :
    salut
    au clavier : ça m'écrit bien
    salut
    à l'ecran mais dès que je fais Entrée, il me reécrit "salut" une deuxième fois à la ligne
    C'est normal. Il est important de bien comprendre le fonctionnement de getchar() qui est plus complexe qu'il n'y parait, et pratiquement jamais expliqué par aucun prof ou bouquin...

    (On admettra que stdin et stdout sont connectés la console)

    Lorsque le programme appelle getchar(), l'exécution se suspend, et c'est le système qui prend la main. Lorsque on tapes sur le clavier, le système renvoie le caractètre tapé à l'écran en temps réel (echo). On peux même éditer (corriger) avec la touche <backspace>. Les caractètres tapés sont stockés dans un buffer système.

    Au moment où l'on tapes <enter>, le système 'rend la main' au programme, getchar() retourne le plus ancien caractère stocké et, celui ci est alors affiché par putchar().

    Ensuite, getchar() est à nouveau appelé, mais comme le buffer de saisie (stdin) n'est pas vide, il va extraire directement le plus ancien caractère non lu et l'afficher, et ce jusqu'à ce que le buffer de saisie soit vide. A ce moment, le programme repasse la main au système qui attend de nouvelles frappes suivies de <enter> ou une commande de fin de lecture simulée par Ctrl-D sous unixoide ou Ctrl-Z sous MS-DOS / Windows...

  8. #8
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Merci pour ces explications, c'est plus clair maintenant dans mon cerveau.
    Je vais pouvoir me lancer dans la suite des exercices !

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

Discussions similaires

  1. Doute sur Entrée et Sortie
    Par Spain_is_different dans le forum Débuter
    Réponses: 1
    Dernier message: 21/07/2009, 22h57
  2. copie entre deux repository sur archiva
    Par root76 dans le forum Maven
    Réponses: 6
    Dernier message: 11/04/2008, 15h15
  3. Touche entrée sur double formulaire -> validation
    Par 10-nice dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 26/10/2005, 12h02
  4. Copie entrée-sortie
    Par Troell dans le forum C
    Réponses: 18
    Dernier message: 24/09/2005, 19h11
  5. gerer les parametres entrée sur un TADOStoredProc
    Par keguira dans le forum Bases de données
    Réponses: 1
    Dernier message: 13/09/2004, 15h56

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