需要帮助getline()

是否有一个原因,如果在我的程序中,我要求用户输入,而我呢:

int number; string str; int accountNumber; cout << "Enter number:"; cin >> number; cout << "Enter name:"; getline(cin, str); cout << "Enter account number:"; cin >> accountNumber; 

为什么在输入第一个数字之后,输入“Enter Name”,然后在输入getline(cin,str)行的“str”之前,立即输入“Enter Account Number”? 谢谢!

getline(cin, str); 读取之前读取的数字后面的换行符,并立即用此“行”返回。 为避免这种情况,您可以在读取名称之前使用std::ws跳过空格:

 cout << "Enter number:"; cin >> number; cout << "Enter name:"; ws(cin); getline(cin, str); ... 

请注意,这也会跳过换行符后面的空格,所以str不会以空格开头,即使用户输入了它们。 但在这种情况下,这可能是一个功能,而不是一个错误…

尝试

 cout << "Enter name:"; cin.ignore(); getline(cin, str); 

看起来你想要基于行的阅读。 为此,您可能希望始终使用getline ,然后解析每行,如果您需要从读取行解析数字。 它使输入读数更加一致。

这样,您不必手动扫描每行的结尾,以确保下一个读取操作在新的一行开始。

它也使添加错误处理重复输入请求更简单。

例如

 #include <string> #include <iostream> #include <istream> #include <ostream> #include <sstream> int parse_integer(const std::string& input) { std::istringstream iss(input); int result; if (!(iss >> result)) { // error - throw something? } return result; } int main() { int number; std::string str; int accountNumber; std::string inputline; std::cout << "Enter number: "; if (!std::getline(std::cin, inputline)) { // error - throw something? } number = parse_integer(inputline); std::cout << "Enter name:"; if (!std::getline(std::cin, inputline)) { // error - throw something? } str = inputline; std::cout << "Enter account number:"; if (!std::getline(std::cin, inputline)) { // error - throw something? } accountNumber = parse_integer(inputline); return 0; } 
 cin >> number // eat the numeric characters getline(cin, str) // eat the remaining newline 
 cin >> number 

只抓取缓冲区中的数字,将缓冲区中的“enter”留下,然后立即被getline抓住并解释为一个空字符串(或者只有新行的字符串,我忘记了)。

我认为问题在于cin >>传递换行符(\n) 。 getline()假定换行符是空格并将其传递。 有人发布了一个可以使用的解决方案。

你可以使用一个虚拟的getline(cin, dummy); 或真实的东西cin.ignore(100,'\n');