Bonjour je cherche a faire une lecture robuste d'un entier et d'un caractère

je viens de coder ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
unsigned int saisirNombreNaturel(const char* msgSaisie) {
	unsigned int n;
	cout << msgSaisie << flush;
	cin >> n;
	if (cin.fail()) { 	// teste l'état de cin 
		cout << "l'entrée n'est pas valide..." << endl;
		cin.clear(); 		// remets cin dans un état lisible
		cin.ignore(INT_MAX, '\n'); // ignore toute la ligne de données
	}
	return n;
}
cela marche parfaitement
mais j'ai voulu l'adapter pour le char
j'ai donc fait :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
char saisirChar(const char* msgSaisie) {
	char c;
	cout << msgSaisie << flush;
	cin.get(c);
	if (cin.fail()) { 	// teste l'état de cin 
		cout << "l'entrée n'est pas valide..." << endl;
		cin.clear(); 		// remets cin dans un état lisible
		cin.ignore(numeric_limits<streamsize>::max(),'\n');
	}
	return c;
}
mais si je tape "akj" lorsque l'on demande un char il m'affiche 3 fois le msgSaisie

(voici le main si vous voulez)

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
int main() {
	unsigned int nb;
	char c;
	char msg[]="Saisir un nombre entre 1 et 5 : ";
	do {
		nb=saisirNombreNaturel(msg);
	} while ((nb < 1) || (nb > 5));
	cout <<"Nombre lu : " << nb << endl;
 
	do {
		c=saisirChar("Saisir une lettre entre a et e : ");
	} while (c < 'a' || c > 'e');
	cout <<"Lettre lue : " << c << endl;
	system("pause");
    return 0;
}