第一次输入后字符串输入被忽略

时间:2021-06-19 08:08:02

标签: c++

我尝试在函数内输入字符串,getline(cin, worker->Name) 第一次输入有效,但对于下一次输入,它跳过或被忽略。它适用于整数,但不适用于字符串,我该怎么办?

代码:

#include <iostream>
using namespace std;

struct Worker {
    string Name;
    int Salary;
    int Status;
    int Child;
};

void InputWorkerData(Worker *worker) {
    cout << "Nama: ";
    getline(cin, Worker->Name);
    cout << "Gaji per bulan: ";
    cin >> worker->Salary;
    cout << "status (menikah = 1, single = 0): ";
    cin >> worker->Status;
    if(worker->Status == 1) {
        cout << "jumlah anak: ";
        cin >> worker->Child;
    } else {
        worker->Child = 0;
    }
    cout << endl;
}

int main() {
    Worker worker1, worker2, worker3;
    InputWorkerData(&worker1);
    InputWorkerData(&worker2);
    InputWorkerData(&worker3);

    return 0;
}

输出:

Nama: michael jordan
Gaji per bulan: 7000
status (menikah = 1, single = 0): 1
jumlah anak: 3

Nama: Gaji per bulan: 5000
status (menikah = 1, single = 0): 0

Nama: Gaji per bulan: 9000
status (menikah = 1, single = 0): 1
jumlah anak: 2

2 个答案:

答案 0 :(得分:0)

混合使用面向行和面向项目的输入会(并且经常会)导致这样的问题。

这似乎符合典型情况:在使用 >> 读取项目(在本例中为数字)后,输入缓冲区中仍有一个换行符。当您调用 getline 时,它会将换行符视为空行的结尾。

有几种方法可以避免这个问题。一种常见的、众所周知的方法是使用 getline 一次读取一行输入,然后使用(对于一种可能性)lexical_cast 将数据从字符串转换为您实际使用的类型想读书。

答案 1 :(得分:-1)

在每次输入之后使用 fflush(stdin),即在 cout 之后和 getline() 之前。它会解决你的问题。你必须先刷新缓冲区。