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 lecture d'un caractère et ecriture d'un caractère


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 9
    Par défaut la lecture d'un caractère et ecriture d'un caractère
    Salut a tous!
    Pourquoi la lecture d'un caractère n'aboutit pas a son écriture avec ce code...
    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
    #include <stdio.h>
    #include <string.h>
    main()
    {
     
        /*int a;
        char b;
        char mot[10];
        printf("entrer le nombre\n");
        scanf("%d",&a); 
        printf("en decimale -->%d\n",a);
        printf("en héxadecimale -->%x\n",a);
        printf("en octal -->%o\n",a);*/
        char b;
        printf("entrer le caractèr\n");
        scanf("%c",&b);
        printf("voici le caractère --> %c\n",b);
        /*printf("entrer la chaine de caractère\n");
        scanf("%s",&mot);
        printf("%s\n",mot);*/
        b=getchar();
    }
    mais à un caractère quelconque ou je ne sait pas d’où il vient??,
    merci d’avance, (je suis débutant);

  2. #2
    Membre actif Avatar de MotorX
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 87
    Par défaut
    Déjà je te conseillerais de déclarer les variables en haut , ensuite la cause de ton problème est certainement que tu ne vides pas le buffer .

    Dans un main oublis pas le return (ce que tu veux , 1 , succe ... )

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bronsoe Voir le message
    Salut a tous!
    Pourquoi la lecture d'un caractère n'aboutit pas a son écriture avec ce code...
    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
    #include <stdio.h>
    #include <string.h>
    main()
    {
     
        /*int a;
        char b;
        char mot[10];
        printf("entrer le nombre\n");
        scanf("%d",&a); 
        printf("en decimale -->%d\n",a);
        printf("en héxadecimale -->%x\n",a);
        printf("en octal -->%o\n",a);*/
        char b;
        printf("entrer le caractèr\n");
        scanf("%c",&b);
        printf("voici le caractère --> %c\n",b);
        /*printf("entrer la chaine de caractère\n");
        scanf("%s",&mot);
        printf("%s\n",mot);*/
        b=getchar();
    }
    mais à un caractère quelconque ou je ne sait pas d’où il vient??,
    Salut

    Bien sûr que si tu le sais. Quand tu tapes ton nombre au tout début, on va dire '18', tu tapes sur quelles touches de ton clavier ?
    => le '1' bien entendu... puis le '8'... puis le 'enter' pour valider
    Le scanf récupère ce '18' dans le clavier pour le mettre dans la variable "a" mais laisse le 'enter'. Au scanf suivant, tu récupères donc ce 'enter'...

    Citation Envoyé par bronsoe Voir le message
    (je suis débutant);
    C'est un des gros problèmes de l'apprentissage du C aux débutants. On est obligés de leur montrer une façon simple de saisir et afficher pour les premiers TP et donc on va direct au scanf/printf qui sont les plus complètes. Malheureusement, scanf n'est pas fait pour une saisie humaine ("f" signifiant que les datas doivent avoir un "format" super précis). Plus tard, on apprend à utiliser des outils plus complexes mais plus adaptés à une saisie manuelle.

    Pour l'instant, rajoute un getchar() après chaque scanf("%d") ou scanf("%c") ou scanf("%f") pour éliminer ce 'enter' et ça roulera.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Pour l'instant, rajoute un getchar() après chaque scanf("%d") ou scanf("%c") ou scanf("%f") pour éliminer ce 'enter' et ça roulera.
    En général il me suffit de mettre un espace avant le format pour vider la saisie.
    scanf(" %d", &a); scanf(" %c", &b); scanf(" %s", mot);

    En passant, ta variable mot est un pointeur vers le début d'un tableau,
    Tu n'as pas à mettre de & devant pour scanf (tout comme tu le fais pour printf ^^)

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par brachior Voir le message
    En général il me suffit de mettre un espace avant le format pour vider la saisie.
    scanf(" %d", &a); scanf(" %c", &b); scanf(" %s", mot);
    Bien vu
    Mais que se passe-t-il si tu es à la première saisie (et que ton buffer clavier est donc vide) ???

    Citation Envoyé par brachior Voir le message
    Citation Envoyé par bronsoe 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
    #include <stdio.h>
    #include <string.h>
    main()
    {
        ...     
        char mot[10];
        ...
        ...
        printf("entrer la chaine de caractère\n");
        scanf("%s",&mot);
        ...
    }
    En passant, ta variable mot est un pointeur vers le début d'un tableau, Tu n'as pas à mettre de & devant pour scanf
    T'as raison. J'aurais dû le voir aussi. Effectivement, pas de "&" à mettre quand il s'agit d'un tableau...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Nouveau candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2010
    Messages : 2
    Par défaut
    Salut,

    Je sais pas d'ou vient ton problème mais en essayant ton code chez moi cela marche parfaitement bien.

  7. #7
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Mais que se passe-t-il si tu es à la première saisie (et que ton buffer clavier est donc vide) ???
    Très bonne question
    En pratique j'ai jamais eut de soucis ^^
    Il semblerait donc que scanf gère ce cas de figure ^^

  8. #8
    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
    Si un caractère <blanc> (caractère pour lequel isspace() retourne vrai : ' ', '\f', '\n', '\r', '\t', '\v'...) figure dans le format, il sera mis en correspondance avec 0,1 ou plusieurs caractères <blanc> du flux d'entrée. On va alors se positionner au premier caractère non <blanc> dans le flux d'entrée (si il existe).

    Ceci ne vide donc pas le buffer des restes de la saisie précédente (qui peuvent être des caractères non <blanc>), mais permet de sauter les caractères <blancs> encore en attente en tête du buffer au moment de la nouvelle entrée.

  9. #9
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    @Diogene : Aurais tu un exemple qui poserai un problème à mon utilisation de scanf ? (mise à part l'utilisation d'un mauvais format ^^) C'est juste par curiosité parce que bon, je n'utilise scanf que durant les phases de tests (rien ne vaut un fgetc ^^))

  10. #10
    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
    Mis à part le cas d'une mauvaise saisie, il faut chercher un peu.
    Comme cette méthode élimine les caractères <blanc> en attente en tête du buffer, on peut se tourner vers le cas où la donnée à lire peut posséder des caractères <blanc> en tête.
    Par exemple :
    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
    int main(void)
    {
      int a;
      char c;
      scanf("%d",&a);
      scanf(" %c",&c);
      switch(c)
      {
        case ' ' : printf("Un blanc");
                   // ....
                   break;
        case '\n' : printf("Un return");
                   // ....
                   break;
        //....
        default :  printf("Autre chose");
                   // ....
      }
      return 0;
    }
    On n'aura jamais "Un blanc" ou "Un return". En l'absence du (des) blanc qui précède %c (ou qui suit %d) le comportement dépend de la manière dont on entre les données (sur une ligne ou sur deux)

    Autre exemple:
    Soit à lire une ligne comportant un entier et une autre comportant une chaine de caractères pouvant posséder des <blanc> en début :
    ligne 1 : "1234\n"       A récupérer 1234
    ligne 2 : "   AB CDE:\n" A récupérer "   AB CDE"
    Le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       scanf("%d",&a);
       scanf("%[^:]",tab);
    donnera pour tab "\n AB CDE"
    Le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      scanf("%d",&a);
      scanf(" %[^:]",tab);
    //ou
    //  scanf("%d ",&a);
    //  scanf("%[^:]",tab);
    //ou
    //  scanf("%d ",&a);
    //  scanf(" %[^:]",tab);
    donnera pour tab "AB CDE"

    Donc, cette méthode marche très souvent, mais on peut trouver des cas où elle est en échec : si on doit lire des caractères <blanc>

  11. #11
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    Ouai donc en gros quasi jamais
    Mais c'est bon à savoir, je te remercie ^^

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/02/2015, 15h08
  2. Réponses: 2
    Dernier message: 27/05/2013, 14h34
  3. Ecriture d'un caractère passé en paramètre
    Par toams69 dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 07/04/2009, 10h26
  4. [DOM XML] Lecture du contenu XML dans une chaine de caractères
    Par diakite4 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 21/05/2008, 20h48
  5. Réponses: 7
    Dernier message: 06/02/2007, 13h27

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