需要帮助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');