有没有理由说如果在我的程序中我要求用户输入,我会这样做:
int number;
string str;
int accountNumber;
cout << "Enter number:";
cin >> number;
cout << "Enter name:";
getline(cin, str);
cout << "Enter account number:";
cin >> accountNumber;
为什么在输入第一个数字后,它输出“输入名称”,然后立即输入“输入帐号”,然后我才输入我的“str”获取getline(cin,str)行?谢谢!
答案 0 :(得分:19)
getline(cin, str);
读取之前读取的数字后面的换行符,并立即返回此“行”。为避免这种情况,您可以在阅读名称之前跳过std::ws
的空格:
cout << "Enter number:";
cin >> number;
cout << "Enter name:";
ws(cin);
getline(cin, str);
...
请注意,这也会在换行符后跳过前导空格,因此即使用户输入了空格,str
也不会以空格开头。但在这种情况下,这可能是一个功能,而不是一个错误......
答案 1 :(得分:13)
尝试
cout << "Enter name:";
cin.ignore();
getline(cin, str);
答案 2 :(得分:5)
看起来你想要基于行的阅读。为此,您可能希望始终使用getline
,然后在需要解析读取行的数字时解析每一行。它使输入读数更加一致。
这样您就不必手动扫描每一行的结尾,以保证下一次读取操作从一个新线开始。
它还可以简化重复输入请求的错误处理。
e.g。
#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;
}
答案 3 :(得分:2)
cin >> number // eat the numeric characters
getline(cin, str) // eat the remaining newline
答案 4 :(得分:2)
cin >> number
只从缓冲区中获取数字,它在缓冲区中留下“enter”,然后由getline立即抓起并解释为空字符串(或者只是新行的字符串,我忘了)。 / p>
答案 5 :(得分:2)
我认为问题是cin >>
传递换行符(\n)
。 getline()假定换行符是空格并传递它。有人发布了你可以使用的解决方案。
您可以使用虚拟getline(cin, dummy);
或真实cin.ignore(100,'\n');
答案 6 :(得分:-2)
不要使用getline()
:这对于内存分配是一件坏事。使用fgets()
。参见fgets
reference。