Question Cin et getline sautent l'entrée [dupliquer]


Cette question a déjà une réponse ici:

plus tôt j'ai posté une question sur cin sauter des entrées, et j'ai eu des résultats à vider et à utiliser istringstream, mais maintenant j'ai essayé toutes les solutions possibles mais aucune ne fonctionne.

voici mon code:

void createNewCustomer () {
    string name, address;

    cout << "Creating a new customer..." << endl;
    cout << "Enter the customer's name: "; getline(cin, name);
    cout << "Enter the customer's address: "; getline(cin, address);

    Customer c(name, address, 0);
    CustomerDB::addCustomer(c);

    cout << endl;
}

mais j'obtiens toujours la même chose, en ignorant les entrées, et quand cela prend des entrées, cela les prend et les magasins dans le nom ne vident rien, et dans l'adresse il faut ce que j'ai écrit dans le nom mais de la 2ème lettre à la fin

qu'est-ce qui ne va pas avec mon code?

J'ai essayé le cin.ignore(), cin.get(), et cin.clear() tous ensemble et seuls, aucun n'a fonctionné

MODIFIER:

méthode principale dans main.cpp appelle mainMenu() seulement

void mainMenu () {
    char choice;

    do {
        system("cls");
        mainMenuDisplay();
        cin >> choice;
        system("cls");

        switch (choice) {
            case '1':
                customerMenu();
                break;

            case '2':
                dvdMenu();
                break;

            case '3':
                receiptMenu();
                break;

            case '4':
                outro();
                break;

            default:
                cout << '\a';
        }

        cin.ignore();
        cin.get();
    } while (choice != '4');
}

Je vais choisir 1 pour l'exemple du client, c'est customerMenu()

void customerMenu () {
    char choice;

    do {
        system("cls");
        manageCustomerMenu();
        cin >> choice;
        system("cls");

        switch (choice) {
            case '1':
                createNewCustomer();
                break;

            case '2':
                deleteCustomer();
                break;

            case '3':
                updateCustomerStatus();
                break;

            case '4':
                viewCustomersList();
                break;

            case '5':
                mainMenu();
                break;

            default:
                cout << '\a';
        }

        cin.ignore();
        cin.get();
    } while (choice != '5');
}

Je choisis 1 encore pour créer un nouvel objet client, qui ira maintenant dans MainFunctions.cpp qui invoquera la fonction createNewCustomer() qui est le premier

void createNewCustomer () {
    string name, address;

    cout << "Creating a new customer..." << endl;
    cout << "Enter the customer's name: "; cin.getline(name,256);
    cout << "Enter the customer's address: "; cin.getline(address,256);

    Customer c(name, address, 0);
    CustomerDB::addCustomer(c);

    cout << endl;
}

38
2018-05-11 14:43


origine


Réponses:


Si vous utilisez getline après cin >> something, vous devez vider la nouvelle ligne du tampon entre les deux.

Mon favori personnel pour cela si aucun caractère après la nouvelle ligne n'est nécessaire est cin.sync(). Cependant, la mise en œuvre est définie, de sorte que cela ne fonctionnera pas de la même manière que pour moi. Pour quelque chose de solide, utilisez cin.ignore(). Ou faire usage de std::ws pour supprimer les espaces blancs si nécessaire:

int a;

cin >> a;
cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n'); 
//discard characters until newline is found

//my method: cin.sync(); //discard unread characters

string s;
getline (cin, s); //newline is gone, so this executes

//other method: getline(cin >> ws, s); //remove all leading whitespace

74
2018-05-11 14:58



La structure de votre code de menu est le problème:

cin >> choice;   // new line character is left in the stream

 switch ( ... ) {
     // We enter the handlers, '\n' still in the stream
 }

cin.ignore();   // Put this right after cin >> choice, before you go on
                // getting input with getline.

10
2018-05-11 15:09



Ici le '\n' laissé par cin, crée des problèmes.

do {
    system("cls");
    manageCustomerMenu();
    cin >> choice;               #This cin is leaving a trailing \n
    system("cls");

    switch (choice) {
        case '1':
            createNewCustomer();
            break;

Ce \n est consommé par la prochaine getline dans createNewCustomer(). Vous devriez plutôt utiliser getline -

do {
    system("cls");
    manageCustomerMenu();
    getline(cin, choice)               
    system("cls");

    switch (choice) {
        case '1':
            createNewCustomer();
            break;

Je pense que cela résoudrait le problème.


2
2018-05-11 15:04



J'ai rencontré ce problème et j'ai résolu ce problème en utilisant getchar () pour intercepter le nouveau caractère ('\ n')


2
2017-12-11 09:35