Dans le chapitre précédent, je vous ai expliqué comment afficher des variables dans la console. Voyons maintenant comment faire le contraire, c'est-à-dire demander des informations à l'utilisateur pour les stocker dans la mémoire.
Lecture depuis la console
Vous l'aurez remarqué, le C++ utilise pas mal de mots tirés de l'anglais. C'est notamment le cas pour le flux sortant
cout, qui doit se lire "c-out". Ce qui est bien, c'est qu'on peut immédiatement en déduire le nom du flux entrant. Avec
cout, les données sortent du programme, d'où le
out. Le contraire de
out en anglais étant
in, qui signifie "vers l'intérieur", on utilise
cin pour faire entrer des informations dans le programme.
cin se décompose aussi sous la forme "c-in" et se prononce "si-inne". C'est important pour les soirées entre programmeurs.
Ce n'est pas tout ! Associés à
cout, il y avait les chevrons (
<<). Dans le cas de
cin, il y en a aussi, mais
dans l'autre sens (
>>).
Voyons ce que ça donne avec un premier exemple.
Code : C++ - Premier exemple de cin 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #include <iostream>
using namespace std;
int main()
{
cout << "Quel age avez-vous ?" << endl;
int ageUtilisateur(0); //On prepare une case memoire pour stocker un entier.
cin >> ageUtilisateur; //On fait entrer un nombre dans cette case.
cout << "Vous avez " << ageUtilisateur << " ans !" << endl; //Et on l'affiche.
return 0;
}
|
Je vous invite à tester ce programme. Voici ce que ça donne avec mon âge

:
Code : Console - Quel âge avez-vous ? | Quel age avez-vous ?
22
Vous avez 22 ans ! |
Que s'est-il passé exactement ?
Le programme a affiché le texte
Quel age avez-vous ?. Jusque-là, rien de bien sorcier. Puis, comme on l'a vu précédemment, à la ligne 8, le programme demande une case mémoire pour stocker un
int à l'ordinateur et il baptise cette case
ageUtilisateur.
Ensuite, ça devient vraiment intéressant. L'ordinateur affiche un curseur blanc clignotant et attend que l'utilisateur écrive quelque chose. Quand celui-ci a terminé et appuyé sur
Entrée, le programme prend ce qui a été écrit et met le contenu dans la case mémoire
ageUtilisateur à la place du 0 qui s'y trouvait.
Finalement, on retombe sur quelque chose de connu, puisque le programme affiche une petite phrase et le contenu de la variable.
Une astuce pour les chevrons
Il arrive souvent que l'on se trompe dans le sens des chevrons. Vous ne seriez pas le premier à écrire
cout >> ou
cin <<, ce qui est faux.
Pour se souvenir du sens correct, je vous conseille de considérer les chevrons comme si c'étaient des flèches indiquant la direction dans laquelle les données se déplacent. Depuis la variable vers
cout ou depuis
cin vers votre variable.
Le mieux est de prendre un petit schéma magique.
Quand on affiche la valeur d'une variable, les données sortent du programme, on utilise donc une flèche allant de la variable vers
cout. Quand on demande une information à l'utilisateur, c'est le contraire, la valeur vient de
cin et va dans la variable.
Avec ça, plus moyen de se tromper !
D'autres variables
Évidemment, ce que je vous ai présenté marche aussi avec d'autres types de variables. Voyons ça avec un petit exemple.
Code : C++ - Lecture d'autres types de variables 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | #include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "Quel est votre prenom ?" << endl;
string nomUtilisateur("Sans nom"); //On crée une case mémoire pour contenir une chaine de caractères
cin >> nomUtilisateur; //On remplit cette case avec ce qu'écrit l'utilisateur
cout << "Combien vaut pi ?" << endl;
double piUtilisateur(-1.); //On crée une case mémoire pour stocker un nombre réel
cin >> piUtilisateur; //Et on remplit cette case avec ce qu'écrit l'utilisateur
cout << "Vous vous appelez " << nomUtilisateur << " et vous pensez que pi vaut " << piUtilisateur << "." << endl;
return 0;
}
|
Je crois que je n'ai même pas besoin de donner d'explications. Je vous invite néanmoins à tester pour bien comprendre en détail ce qui se passe.
Le problème des espaces
Avez-vous testé le code précédent en mettant votre nom et prénom ? Regardons ce que ça donne.
Code : Console - Les soucis d'Albert | Quel est votre prenom ?
Albert Einstein
Combien vaut pi ?
Vous vous appelez Albert et vous pensez que pi vaut 0. |

L'ordinateur n'a rien demandé pour pi et le nom de famille a disparu ! Que s'est-il passé ?
C'est un problème d'espaces. Quand on appuie sur
Entrée, l'ordinateur copie ce qui a été écrit par l'utilisateur dans la case mémoire. Mais, il s'arrête à la première
espace ou au premier
retour à la ligne. Quand il s'agit d'un nombre, cela ne pose pas de problèmes puisqu'il n'y a pas d'espaces dans les nombres.
Pour les
string, le problème se pose. Il peut très bien y avoir une espace dans une chaîne de caractère. Et donc l'ordinateur va couper au mauvais endroit, c'est-à-dire après le premier mot. Et comme il n'est pas très malin, il va croire que le nom de famille correspond à la valeur de pi !
Il faudrait en fait pouvoir récupérer toute la ligne plutôt que juste le premier mot. Et si je vous le propose, c'est qu'il y a une solution pour le faire !
Il faut utiliser la
fonction getline(). Nous verrons plus loin ce que sont exactement les fonctions, mais pour l'instant voyons comment faire dans ce cas particulier.
Il faut remplacer la ligne
cin >> nomUtilisateur; par un
getline().
Code : C++ - Lecture d'une ligne complète 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | #include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "Quel est votre nom ?" << endl;
string nomUtilisateur("Sans nom"); //On crée une case mémoire pour contenir une chaine de caractères
getline(cin, nomUtilisateur); //On remplit cette case avec toute la ligne que l'utilisateur a écrite
cout << "Combien vaut pi ?" << endl;
double piUtilisateur(-1.); //On crée une case mémoire pour stocker un nombre réel
cin >> piUtilisateur; //Et on remplit cette case avec ce qu'écrit l'utilisateur
cout << "Vous vous appelez " << nomUtilisateur << " et vous pensez que pi vaut " << piUtilisateur << "." << endl;
return 0;
}
|
On retrouve les mêmes éléments qu'auparavant. Il y a
cin et il y a le nom de la variable (
nomUtilisateur), sauf que cette fois, le tout se trouve entre des parenthèses et séparé par une virgule et pas par des chevrons.
L'ordre des éléments entre les parenthèses est très important. Il faut absolument mettre le cin en premier !
Cette fois le nom ne sera pas tronqué lors de la lecture et notre ami Albert pourra utiliser notre programme sans soucis.
Code : Console - Plus de soucis pour Albert | Quel est votre nom ?
Albert Einstein
Combien vaut pi ?
3.14
Vous vous appelez Albert Einstein et vous pensez que pi vaut 3.14. |
Demander d'abord la valeur de pi
Si l'on utilise d'abord
cin >> puis
getline(), par exemple en demandant d'abord la valeur de

avant de demander le nom, le code ne marche pas. L'ordinateur ne demande pas son nom à l'utilisateur et affiche n'importe quoi.
Pour palier ce problème, il faut ajouter la ligne
cin.ignore() après l'utilisation des chevrons.
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | #include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "Combien vaut pi ?" << endl;
double piUtilisateur(-1.); //On crée une case mémoire pour stocker un nombre réel
cin >> piUtilisateur; //Et on remplit cette case avec ce qu'écrit l'utilisateur
cin.ignore();
cout << "Quel est votre nom ?" << endl;
string nomUtilisateur("Sans nom"); //On crée une case mémoire pour contenir une chaine de caractères
getline(cin, nomUtilisateur); //On remplit cette case avec toute la ligne que l'utilisateur a écrite
cout << "Vous vous appelez " << nomUtilisateur << " et vous pensez que pi vaut " << piUtilisateur << "." << endl;
return 0;
}
|
Avec ça, plus de soucis.
Quand on mélange l'utilisation des chevrons et de
getline(), il faut toujours faire
cin.ignore() après la ligne
cin>>a. C'est une règle à apprendre.
Voyons maintenant ce que l'on peut faire avec des variables. Par exemple, additionner deux nombres.