49 votes

Utilisation de getline(cin, s) après cin

J'ai besoin du programme suivant pour prendre la ligne entière d'entrée de l'utilisateur et la mettre dans des noms de chaîne :

cout << "Enter the number: ";
int number;
cin >> number;

cout << "Enter names: ";
string names;

getline(cin, names);

Avec le cin >> number avant la commande getline() (ce qui, je suppose, est le problème), il ne me permet pas d'entrer des noms. Pourquoi ?

J'ai entendu quelque chose à propos d'un cin.clear() mais je n'ai aucune idée de la manière dont cela fonctionne ou de la raison pour laquelle cela est nécessaire.

0voto

lopezdp Points 504

Vous voulez utiliser cin.ignore() après vos instructions cin parce que vous voulez ignorer le " \n " restant dans le tampon après avoir pris votre variable int avec cin.

J'ai un programme similaire que j'ai utilisé avec un problème similaire :

#include <iostream>
#include <iomanip>
#include <limits>

using namespace std;

int main() {
    int i = 4;
    double d = 4.0;
    string s = "HackerRank ";

    // Declare second integer, double, and String variables.
    int n;
    double d2;
    string str;

    // Read and save an integer, double, and String to your variables.
    cin >> n;
    cin >> d2;

    cin.ignore();

    getline(cin, str);

    // Print the sum of both integer variables on a new line.
    cout << i + n << endl;

    // Print the sum of the double variables on a new line.
    cout << d + d2 << endl;

    // Concatenate and print the String variables on a new line
    cout << s << str << endl;

    // The 's' variable above should be printed first.

    return 0;
}

0voto

minhle_r7 Points 626

D'un point de vue conceptuel, je pense que vous voulez que chaque réponse soit proprement d'une ligne. Alors pourquoi n'essayez-vous pas ceci ?

cout << "Enter the number: ";
string line;
getline(cin, line);
int number = std::stoi(line);

cout << "Enter names: ";
string names;
getline(cin, names);

Le code consomme correctement le premier caractère de nouvelle ligne, vous donne le numéro si la ligne est correcte ou lève une exception si elle ne l'est pas. Le tout gratuitement !

-1voto

max Points 1
#include <iostream>
#include <string>

using namespace std;

int main()
{
    cout << "Enter the number: ";
    int number;
    cin >> number;
    cout << "Enter names: ";
    string names;

    // USE peek() TO SOLVE IT! ;)
    if (cin.peek() == '\n') {
        cin.ignore(1 /*numeric_limits<streamsize>::max()*/, '\n');
    }

    getline(cin, names);

    return 0;
}

Il suffit de regarder devant soi en utilisant cin.peek() et voir si un '\n' reste encore dans cin Le tampon interne de l'entreprise. Si c'est le cas, ignorez-la (en fait, passez-la).

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