我尝试在函数内输入字符串,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
答案 0 :(得分:0)
混合使用面向行和面向项目的输入会(并且经常会)导致这样的问题。
这似乎符合典型情况:在使用 >>
读取项目(在本例中为数字)后,输入缓冲区中仍有一个换行符。当您调用 getline
时,它会将换行符视为空行的结尾。
有几种方法可以避免这个问题。一种常见的、众所周知的方法是使用 getline
一次读取一行输入,然后使用(对于一种可能性)lexical_cast
将数据从字符串转换为您实际使用的类型想读书。
答案 1 :(得分:-1)
在每次输入之后使用 fflush(stdin),即在 cout 之后和 getline() 之前。它会解决你的问题。你必须先刷新缓冲区。