2010-09-01 15 views
0

Je le code suivant:comportement bizarre avec std :: getline et std :: vecteur <std::string>

std::vector<std::string> final_output; 
std::string input; 

int tries = 0; 
std::cin >> tries; 

int counter = 0; 
while(counter < tries) { 

    std::getline(std::cin, input); 
    final_output.push_back(input); 
    ++counter; 

} 

Compte tenu de l'entrée:

3 
Here Goes 
Here Goes 2 

La sortie est:

<blank line> 
Here Goes 
Here Goes 2 

Bizarrement, il semble entrer une ligne vide comme entrée pour la première fois qu'il s'exécute.

Cependant, si je le code comme:

int tries = 3;   // explicitly specifying the number of tries 
int counter = 0; 
while(counter < tries) {} 

Il fonctionne comme prévu. Pourquoi le code std::cin >> tries fait-il échouer le code?

Je l'ai testé avec VC 2010 et de g ++ 4.4.3

Répondre

2

Lorsque vous entrez le numéro tries, vous appuyez sur la touche de retour. Après avoir lu tries, le retour chariot de frapper la touche de retour est toujours assis dans le tampon d'entrée. Ce retour chariot sera normalement traduit en caractère de nouvelle ligne. Votre prochain appel à getline lit tout dans le tampon d'entrée jusqu'à la nouvelle ligne suivante. Comme le premier caractère est une nouvelle ligne, il lit cela comme une ligne de longueur nulle (c'est-à-dire, zéro caractère avant la nouvelle ligne).

+0

Merci, je l'ai maintenant. – user225312

1

La nouvelle ligne de la première entrée est encore dans la mémoire tampon d'entrée.

Vous pouvez appeler std::cin.ignore(); juste après avoir lu les essais de cin.

De cette façon, le saut de ligne est ignoré.

J'ai trouvé un bon lien qui explique beaucoup de choses concernant l'utilisation d'E/S:

+0

Mais je ne comprends pas? Je viens d'entrer un 'int'. Pourquoi y aurait-il une nouvelle ligne après cela? – user225312

+0

Aah je vois. C'est dans le tampon. Merci. – user225312

+0

oui, le retour à la ligne indique à cin que l'entrée a été faite mais elle vient aussi dans le buffer. – jdehaan

0

Vous n'avez rien à absorber '\n' à partir de la première ligne de votre autonome std::cin >> tries.