Comportement bizarre de std::cin, il reste un double dans le buffer

a marqué ce sujet comme résolu.

Bonjour à tous, Je débute en c++ et je suis le tutoriel c++ moderne de zestedesavoir que j’apprécie tout particulièrement.

Lorsque je donne à Cin un réel au lieu d’un entier il garde la parti décimal dans son buffer.

Voici mon code :

#include <iostream>
#include <string>

int main() {

	void lectureConsole(int& age);
	void lectureConsole(double& taille);
	void lectureConsole(std::string & nom);
	int age{ 0 };
	double taille{ 0.0 };
	std::string nom{ "" };

	std::cout << "quelle est votre age ?" << std::endl;
	lectureConsole(age);
	std::cout << "voici votre age : " << age << std::endl;
	std::cout << "quelle est votre taille ?" << std::endl;
	lectureConsole(taille);
	std::cout << "voici votre taille : " << taille << std::endl;

}

void lectureConsole(int &variable){

	while (!(std::cin >> variable))
	{
		std::cout << "Entrer un entier pour age"<<std::endl;
		std::cin.clear();
		std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
	}
}

void lectureConsole(double& variable) {

	while (!(std::cin >> variable))
	{
		std::cout << "Entrer un reel pour taille" << std::endl;
		std::cin.clear();
		std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
	}
}

Voici se que j’obtiens sur la console :

quelle est votre age ?

12.5

voici votre age : 12

quelle est votre taille ?

voici votre taille : 0.5

Je ne comprend pas du tout ce phénomène ou il enregistre directement la partie entier pour le int : 12 et 0.5, a la demande d’un double sans que j’ai le temps de taper quoi que ce sois.

Comment peut on tout effacer dans le buffer ou trouver une autre stratégie ?

Merci d’avance :).

Sur le pourquoi tu obtiens 12 puis 0.5, c’est parce qu’en C++ un double peut s’écrire .456 (qui équivaut à 0.456). De son point de vue, il lit un nombre 12 (et s’arrête au premier caractère qui n’est pas 0123456789) puis tu lui demandes de lire un double : .5 c’est un double valide.

Si tu tiens vraiment à ce qu’il y ait un saut à la ligne entre chaque entrée, tu peux faire ainsi :

std::cout << "voici votre age : " << age << std::endl;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "quelle est votre taille ?" << std::endl;
+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte