2010-10-09 26 views
2

Pourquoi cin.getline commence-t-il à travailler sur la deuxième ligne de l'entrée du corps, mais se casse la première?cin.getline saute une ligne d'entrée et passe à la suivante

exécuter le programme Exemple:

Enter name: Will 
Enter body: hello world 
hello again <= It accepts this one 



char* name = new char[100]; 
char* body = new char[500]; 

std::cout << "Enter name: "; 
std::cin.clear(); 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
std::cin.getline(name, 100); 

std::cout << "Enter body: "; 
std::cin.clear(); 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
std::cin.getline(body, 500'); 
std::cin >> body; 
+0

Que voulez-vous dire qu'il ne fonctionne pas? –

Répondre

2

Parce que vous ne tenez pas compte de la première ligne avec l'instruction cin.ignore.

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

Cela ignorera une ligne entière.

Enlevez cela et vous obtiendrez ce que vous voulez.

Vous pouvez également vider le flux cout pour assurer l'impression immédiate de votre sortie sur l'écran. Ajoutez un cout.flush(); avant votre getline.

+0

J'ai enlevé les deux et c'était la même chose sauf qu'il a sauté l'entrée du nom – Will03uk

+0

@ Will03uk: J'ai ajouté un peu à ma réponse. Vous voudrez peut-être ajouter une couleur. – JoshD

+2

J'ai fait la même assertion à propos de flush aq il y a quelques semaines, mais @anon a fait remarquer que std :: cin est lié à std :: cout forçant un flush automatique avant que std :: cin fasse une lecture: http: // www .cplusplus.com/référence/iostream/ios/tie/ –

2

Comme le dit JoshD, mais en plus, vous pouvez économiser beaucoup de douleur de travail & en utilisant std::string et std::getline de l'en-tête <string>.

... Comme

#include <string> 
#include <iostream> 
int main() 
{ 
    using namespace std; 
    std::string name; 
    cout << "Enter name: "; getline(cin, name); 
} 

Vive & HTH,

-. Alf

+0

Non de cela fonctionne? – Will03uk