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

Langage C++ Discussion :

Question à propos de char


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 4
    Par défaut Question à propos de char
    Bonjour,

    je débute en programmation c++, regardez 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
    #include <iostream>
    #include <string>
    using namespace std;
    int main(){
    char a('a'),b('b'),c('c'),d('d'),e('e'),f;
    int aA(0),bB(0),cC(0),dD(0),eE(0);
    bool stator;
    while(stator){
    cin>>f;
    if(f==a){aA++; cout<<"il y a "<<aA<<" a. "<<endl;}
    if(f==b){bB++; cout<<"il y a "<<bB<<" b. "<<endl;}
    if(f==c){cC++; cout<<"il y a "<<cC<<" c. "<<endl;}
    if(f==d){dD++; cout<<"il y a "<<dD<<" d. "<<endl;}
    if(f==e){eE++; cout<<"il y a "<<eE<<" e. "<<endl;}}
    return 0;}
    J'ai appris qu'une variable de type char ne pouvait prendre qu'une seule valeur, celle d'une lettre, seulement dans ce code j'observe le contraire, la variable f de type char prend simultanément toutes les lettres que je tape, voyez par vous même. Quand je tape une suite de lettre par exemple : hello world, que j'appuie sur entrer, regardez ce qu'il se passe. Intuitivement j'aurais dit que le f prendrait uniquement la valeur h de hello world, une explication ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Si tu essayes de rentrer "hello world" dans f par un opérateur >> sur cin tu feras surtout passer en erreur le stream, partant de là il pourrait même sortir des démons de ton nez que ça ne serait pas incohérent puisque tu es dans un état indéterminé.
    Tu mets plusieurs caractères dans le buffer de cin et a une valeur initiale de stator indéterminée.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 4
    Par défaut
    Il est donc aisé de faire bugger un programme du moins avec mes connaissances, comment empêcher ce cas particulier, que la variable f quand j'écris hello world n'enregistre que le h ?

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Le comportement de cin est en fait entièrement déterminé, avec un char, à part une erreur de lecture ou la fin du fichier, il n'y a jamais de problème. Ce qui n'est pas déterminé est la valeur de stator. Mais un compilateur correctement configuré l'indique.

    que la variable f quand j'écris hello world n'enregistre que le h ?
    En ne mettant pas de boucle ?

    PS: L'indentation aide beaucoup à la compréhension d'un code, tu devrais t'y mettre.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par frombelgium Voir le message
    Il est donc aisé de faire bugger un programme du moins avec mes connaissances, comment empêcher ce cas particulier, que la variable f quand j'écris hello world n'enregistre que le h ?
    Ton programme est surtout mal écrit.
    Tu utilises stator sans qu'elle soit initialisée. Tu ne gères pas les possibles erreurs de lecture de cin.
    - tu as de la chance que stator vaille true au départ
    - tu entres plusieurs caractères dans le buffer de cin
    - à chaque boucle cin chope le caractère suivant et l'injecte dans f

    Si tu changes ton programme ne serait-ce que par
    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
    #include <iostream>
    #include <string>
    using namespace std;
    int main(){
    	char a('a'), b('b'), c('c'), d('d'), e('e'), f;
    	int aA(0), bB(0), cC(0), dD(0), eE(0);
    	bool stator = true;
    	while ( stator )
    	{
    		cin >> f;
    		if ( f == a ){ aA++; cout << "il y a " << aA << " a. " << endl; }
    		else if ( f == b ){ bB++; cout << "il y a " << bB << " b. " << endl; }
    		else if ( f == c ){ cC++; cout << "il y a " << cC << " c. " << endl; }
    		else if ( f == d ){ dD++; cout << "il y a " << dD << " d. " << endl; }
    		else if ( f == e ){ eE++; cout << "il y a " << eE << " e. " << endl; }
    		else { cout << "rien" << endl; }
     
    		cout << ">";
    	}
    	return 0;
    }
    Tu pourras constater que
    Nom : cin.png
Affichages : 270
Taille : 4,6 Ko
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 4
    Par défaut
    Merci de vos interventions,

    "- à chaque boucle cin chope le caractère suivant et l'injecte dans f"

    c'est cela que je voulais savoir, pour poursuivre dans le cadre de l'indentation, c'est une pratique courante d'utiliser cette propriété de cin ou c'est du genre non conventionnel ?

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    L'indentation n'a rien à voir cin. Cela concerne la présentation du code. Le fait de mettre des espaces/tabulation en début de ligne pour distinguer l’imbrication de code (boucle, condition, corps de fonction, etc).
    Compare le code posté dans ton premier message et celui de Bousk, niveau clarté, il n'y a pas photo, le second est beaucoup plus lisible.

    De quelle propriété de cin parles-tu ?

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 4
    Par défaut
    Je sais tout à fait, je parle du cadre dans lequel ce trouve l'indentation, celui d'apporter le confort aux programmeurs, je parle de la propriété de cin ici :
    "- à chaque boucle cin chope le caractère suivant et l'injecte dans f".

Discussions similaires

  1. Question à propos des niveaux de transaction
    Par davy.g dans le forum Oracle
    Réponses: 3
    Dernier message: 18/01/2005, 15h31
  2. Petite question à propos du redbook...
    Par Michaël dans le forum OpenGL
    Réponses: 3
    Dernier message: 04/11/2004, 12h54
  3. Petite question à propos d'une requete
    Par ViBy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/09/2004, 12h21
  4. Réponses: 3
    Dernier message: 26/05/2004, 23h03
  5. Une question à propos des thread
    Par tscoops dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/11/2003, 14h03

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