2 votes

Utilisation de deux gets() en C++

Je suis en train d'apprendre les classes en C++. J'ai fait un programme simple en utilisant le concept des classes. Dans ce programme, j'ai besoin que la personne entre les détails du livre. Voici cette fonction :

void Book::add(){
cout << "Enter name of Book: ";
gets(book_name);gets(book_name);
cout << "\n\nPlease enter the book id: ";
cin >> book_id;
cout << "\n\nThank you the book has been added.";
total++;
input = getchar();
getchar();
}

Remarquez que dans la troisième ligne, je dois utiliser deux get pour obtenir l'entrée de l'utilisateur. Si j'utilise un gets voici la sortie. On saute juste l'instruction "gets". De même, à d'autres endroits, je dois utiliser deux instructions getchar. J'ai pu trouver la réponse à cela sur l'OS lui-même. Ex Pourquoi mon professeur utilise deux getchar . Je n'ai pas trouvé la réponse à deux affirmations, cependant. Voici le code complet au cas où cela serait nécessaire.

3voto

stardust Points 5638

C'est parce que vous avez une queue new line (de Enter ) restant sur le flux qui n'est pas lu par la première opération de lecture. Ainsi, la première gets(book_name) va lire cela et passer à la prochaine demande de contribution.

utiliser getline pour retirer du flux toute entrée offensante restante.

void Book::add(){
    string garbage;
    getline(cin,garbage);  // this will read any remaining input in stream. That is from when you entered 'a' and pressed enter.
    cout << "Enter name of Book: ";
    gets(book_name);
    getline(cin,garbage);  // this will read any remaining input in stream.
    cout << "\n\nPlease enter the book id: ";
    cin >> book_id;

Quoi qu'il en soit, il suffit d'utiliser la méthode la plus sûre pour lire les entrées à partir des flux.

cin >> book_name;

au lieu de gets . Alors vous n'aurez pas de tels problèmes.


si vous voulez lire des entrées séparées par des espaces dans une chaîne de caractères, utilisez std::getline ( comme je l'ai fait pour les ordures ci-dessus )

std::getline(cin,book_name);

1voto

mtt Points 106

cin y cout proviennent de <iostream> et reçoit de <cstdio> . Ce n'est pas une bonne idée de mélanger ces deux éléments si vous ne savez pas exactement comment ils fonctionnent et quelle est la différence.

Une meilleure idée est d'utiliser cin.getline()

cin.getline(char* s, streamsize n );

Le deuxième paramètre est la longueur maximale de l'entrée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X