web-dev-qa-db-fra.com

cin et getline sautant l'entrée

un peu plus tôt, j'avais posté une question sur cin, en sautant l'entrée, et j'ai eu des résultats à effacer et à utiliser istringstream, mais maintenant j'ai essayé toutes les solutions possibles, mais aucune d'entre elles 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 je reçois toujours la même chose, en sautant des entrées, et quand cela prend des entrées, il les prend et les stocke au nom vide rien, et à l'adresse il prend ce que j'ai écrit nominativement mais de la 2ème lettre à la fin

quel est le problème avec mon code?

J'ai essayé les cin.ignore(), cin.get() et cin.clear() tous ensemble et seuls, aucun d'entre eux 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 à nouveau 1 pour créer un nouvel objet client, qui passera maintenant à MainFunctions.cpp qui invoquera la fonction createNewCustomer(), qui est la première.

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;
}
42
hakuna matata

Si vous utilisez getline après cin >> something, Vous devez vider la nouvelle ligne de la mémoire tampon entre les deux.

Mon favori personnel pour cela si aucun caractère n'est nécessaire après la nouvelle ligne est cin.sync(). Cependant, comme il est défini par la mise en œuvre, il se peut que cela ne fonctionne pas de la même manière que pour moi. Pour quelque chose de solide, utilisez cin.ignore(). Ou utilisez std::ws Pour supprimer les espaces, 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
77
chris

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
jrok

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 en train d'être consommé par la ligne suivante dans createNewCustomer(). Vous devriez utiliser getline à la place -

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
theharshest

J'ai fait face à ce problème et résolu ce problème en utilisant getchar () pour récupérer le nouveau caractère ('\ n')

2
user2135533