2017-09-13 5 views
0

Utilisation de C++ 14. J'ai lu beaucoup de messages concernant le problème.getline (cin, chaîne) ne donnant pas la sortie attendue

Si j'exécute ce code ci-dessous, il saute par-dessus les lignes getline.

#include <iostream> 
#include "main_menu.h" 

void MainMenu::AddTest() 
{ 
    std::string courseName = ""; 
    std::string testName = ""; 
    std::string date = ""; 

    std::cout << "Enter course name: " << std::endl; 
    std::getline(std::cin, courseName); 

    std::cout << "Enter test name: " << std::endl; 
    std::getline(std::cin, testName); 

    std::cout << "Enter test date: " << std::endl; 
    std::getline(std::cin, date); 

    Test test(courseName, testName, date); 
    tests.Add(test); 

    std::cout << "Test registered : " << std::endl; 
    tests.Print(test.id); 
} 

Si j'ajouter après chaque cin ignorer les lignes de getline (exemple ci-dessous comment je mets en œuvre), il supprime certains caractères des chaînes d'entrée et utilise des variables mauvaises pour les stocker. Notez que j'ai des chaînes avec des espaces.

std::getline(std::cin, courseName); 
std::cin.ignore(); 

C'est ce que je reçois:

Enter course name: 
History 2 
Enter test name:  
History 2 exam 
Enter test date: 
2017.01.02 
Test registered : 
test id = 2, course name = , test name = istory 2, date = istory 2 exam 

J'ai essayé aussi de vider Cout, n'a pas aidé.

Ma fonction d'impression fonctionne comme un charme, si j'ajoute des cours manuellement à partir de main, j'obtiens la sortie attendue, donc le problème est définitivement le cin/getline.

Test registered : 
test id = 1, course name = History 2, test name = History 2 exam , date = 01.02.2017 

J'utilise getline comme expliqué ici: http://www.cplusplus.com/reference/string/string/getline/?kw=getline

Toute aide serait très apprécié, je vous remercie.

Répondre

0

En utilisant cin.ignore vous jouez avec l'entrée elle-même. Si vous voulez vous débarrasser de \n personnage que vous n'avez pas à! getline le fera automatiquement. Donc, n'utilisez pas la fonction ignore et le code ira bien. Cela fonctionne:

#include<iostream> 

using namespace std; 

int main() 
{ 
    string courseName = ""; 
    string testName = ""; 
    string date = ""; 

    cout << "Enter course name: " << std::endl; 
    getline(std::cin, courseName); 

    cout << "Enter test name: " << std::endl; 
    getline(std::cin, testName); 

    cout << "Enter test date: " << std::endl; 
    getline(std::cin, date); 

    cout << courseName << endl; 
    cout << testName << endl; 
    cout << date << endl; 
    return 0; 
} 
+0

Si je ne me le cin.ignore, je ne peux jamais entrer dans le cin lui-même. Le programme va plus loin au prochain cout, sans attendre d'entrée. Il liste essentiellement mes cout, c'est mon problème initial. @Sinapse –

+0

'cin.ignore' passera juste un de vos caractères entrés! Pouvez-vous tester le code ci-dessus? Quel est votre compilateur? – Sinapse

+0

Votre code fonctionne, pas le mien. Le programme n'attendra pas d'entrée. S'il vous plaît jeter un oeil à mon code original sur le dessus (celui sans cin.ignore), je ne vois pas beaucoup de différence. J'utilise GDB clion btw. –