Utiliser getline () en C++

j'ai un problème en utilisant la méthode getline pour obtenir un message que l'utilisateur tape, j'utilise quelque chose comme:

string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);

cependant, il ne s'arrête pas pour obtenir la valeur de sortie, qu'est-ce qui ne va pas avec ça?

40
demandé sur MGE 2013-09-13 16:40:28

6 réponses

Si vous utilisez getline() après cin >> something, vous devez vider le caractère newline du tampon entre les deux. Vous pouvez le faire en utilisant cin.ignore().

Ce serait quelque chose comme ceci:

string messageVar;
cout << "Type your message: ";
cin.ignore(); 
getline(cin, messageVar);

Cela se produit parce que le >> opérateur de feuilles d'un retour à la ligne \n caractère dans le tampon d'entrée. Cela peut devenir un problème lorsque vous faites des entrées non formatées, comme getline(), qui lit les entrées jusqu'à ce qu'un caractère newline soit trouvé. Ce happening, il cessera de lire immédiatement, à cause de cela \n qui était suspendu là lors de votre précédente opération.

73
répondu streppel 2017-07-21 18:52:51

si vous n'avez qu'une seule ligne dans l'entrée, faites juste

std::cin.ignore();

fonctionne très bien. Il lit et écarte le caractère suivant de l'entrée.

mais si vous avez encore autre chose dans l'entrée, en plus de la nouvelle ligne (par exemple, vous avez lu un mot mais l'Utilisateur a entré deux mots), alors vous devez faire

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

voir par exemple cette référence du ignore function.

Pour être encore plus sûr, faire le deuxième alternative ci-dessus dans une boucle jusqu'à gcount renvoie zéro.

5
répondu Some programmer dude 2013-09-13 13:00:57
int main(){
.... example with file
     //input is a file
    if(input.is_open()){
        cin.ignore(1,'\n'); //it ignores everything after new line
        cin.getline(buffer,255); // save it in buffer
        input<<buffer; //save it in input(it's a file)
        input.close();
    }
}
2
répondu Antonija 2014-08-16 11:54:04

j'ai eu des problèmes similaires. Le seul inconvénient, c'est qu'avec cin.ignore (), vous devez appuyer sur enter 1 fois de plus ce qui perturbe le programme.

2
répondu logankilpatrick 2017-02-27 00:40:04

le code est correct. Le problème doit se situer quelque part d'autre. Essayez l'exemple minimaliste de la documentation std::getline.

main ()
{
    std::string name;

    std::cout << "Please, enter your full name: ";
    std::getline (std::cin,name);
    std::cout << "Hello, " << name << "!\n";

    return 0;
}
0
répondu Konstantin 2013-09-13 12:47:52

je pense que vous n'êtes pas en pause le programme avant de il terminé de sorte que la sortie de sa mise après l'obtention de la inpus n'est pas de voir sur la droite de l'écran?

faire:

getchar();

avant la fin du programme

-1
répondu No Idea For Name 2013-09-13 12:47:51