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?
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.
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.
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();
}
}
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.
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;
}
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