Memperbarui variabel yang sama beberapa kali [duplikat]

Kemungkinan Duplikat:
Masalah penggunaan cin dua kali

Kode ini berfungsi tetapi tidak sesuai keinginan saya. Setiap kali saya ingin memasukkan gaji baru dengan menekan 1 maka output pada command prompt akan menjadi seperti ini:

Comic books             : USD Input error! Salary must be in positive integer.



Kode harus berhenti di cout<<"\n\nComic books\t\t: USD "; pada baris 4 tetapi hanya dieksekusi dengan loop while bagian dalam. Ini kodenya:

    double multiplePay =0;

    cout<<"\n\nEnter employee pay for each job";
    while (1){
    cout<<"\n\nComic books\t\t: USD ";
    //cin.get(); if enable, the first user input will be 0. this is not working.

    std::string comic_string;
    double comic_double;
    while (std::getline(std::cin, comic_string))
    {
        std::stringstream ss(comic_string); // check for integer value

        if (ss >> comic_double)
        {
            if (ss.eof())
            {   // Success so get out
                break;
            }
        }

        std::cout << "Input error! Salary must be in positive integer.\n" << std::endl;
        cout<<"Employee salary\t: ";
    }

    comic = strtod(comic_string.c_str(), NULL);

        multiplePay = comic + multiplePay; // update previous salary with new user input
        cout << multiplePay;
    cout << "Add other pay?"; // add new salary again?
    int y;

    cin >> y;
    if (y == 1){


        cout << multiplePay;
    }
    else{
        break;
    }
    } // while

cout << multiplePay;  //the sum of all salary

Menggunakan cin.get() akan menyelesaikan masalah tetapi masukan gaji pengguna pertama akan menjadi 0 dan hanya masukan berikutnya yang akan dihitung. Tolong bantu saya dengan ini. Terima kasih sebelumnya.


person sg552    schedule 22.12.2012    source sumber


Jawaban (2)


Masalah Anda adalah cin >> y; akan membaca int, tetapi membiarkan akhir baris \n di buffer input. Lain kali Anda menggunakan getline, akhir baris ini akan segera ditemukan dan tidak menunggu masukan apa pun lagi.

person Bo Persson    schedule 22.12.2012
comment
Ya, itulah masalahnya. Menambahkan cin.get() di if statement terakhir memecahkan masalah. Terima kasih lagi. - person sg552; 22.12.2012

std::basic_ios::eof() (dalam ss.eof()) tidak berfungsi seperti yang Anda kira berhasil .

    if (ss >> comic_double)
    {
        if (ss.eof())
        {   // Success so get out
            break;
        }
    }

ss.eof() hanya akan benar jika panggilan ss.get() atau ekstraksi lainnya gagal karena Anda berada di akhir file. Tidak masalah apakah kursor saat ini berada di bagian akhir.

Perhatikan bahwa Anda memperbaikinya dengan sangat mudah menggunakan ss.get():

    if (ss >> comic_double)
    {
        ss.get(); // if we are at the end ss.eof() will be true after this op

        if (ss.eof())
        {   // Success so get out
            break;
        }
    }
person Zeta    schedule 22.12.2012