C++ 为什么还剩下输入缓冲区?

c++ why is there still input buffer left?

本文关键字:输入 缓冲区 为什么 C++      更新时间:2023-10-16

在我的第一个条目之后,我的第二个输入name字段被上一个条目的输入缓冲区填满。为什么?我什至正在使用getline但问题仍然存在。请帮助我解决问题。这是《跳进书C++》中的问题。

#include <iostream>
#include <string>
using namespace std;
struct Person
{
string name;
string address;
long long int PhoneNumber;
};
void displayEntries(Person p[])
{
int enteryNumber;
cout << "Enter the entry number of the person for details(enter 0 to display all entries): ";
cin >> enteryNumber;
if(enteryNumber == 0)
{
for(int i = 0; i < 10; i++)
{
cout << "Entery Number: " << i + 1;
cout << "Name: " << p[i].name << endl;
cout << "Address: " << p[i].address << endl;
cout << "Phone Number: " << p[i].PhoneNumber << endl;
}
}
do
{
cout << "Entery Number: " << enteryNumber;
cout << "Name: " << p[enteryNumber].name << endl;
cout << "Address: " << p[enteryNumber].address << endl;
cout << "Phone Number: " << p[enteryNumber].PhoneNumber << endl;
} while (enteryNumber != 0);
}
int main()
{
Person p[10];
for(int i = 0; i < 10; i++)
{
cout << "Enter the details of the personnn";
cout << "Name: ";
getline(cin, p[i].name);
cout << "Address: ";
getline(cin, p[i].address);
cout << "Phone Number: ";
cin >> p[i].PhoneNumber;
cout << endl;
}
displayEntries(p);
return 0;
}

当您阅读getline的参考时,您可以看到发生了什么:

在空格分隔的输入之后立即使用时,例如在

int n; 
std::cin >> n; 
getline(cin, n); //if used here

getline使用operator>>,留在输入流上的结束行字符并立即返回。一种常见的解决方案是忽略输入行上的所有剩余字符

cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n'); 

在切换到面向线路的输入之前。

cin >> p[i].PhoneNumber;只获取数字。这样,仍然在输入缓冲区中结束的行将在下次尝试读取一行时读取。