是否有一个原因,如果在我的程序中我要求用户输入,我这样做:
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)线?谢谢!
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
,然后解析每一行,如果你需要从那个读取行解析一个数字。它使输入读数更加一致。
这样您就不必手动扫描每一行的结尾,以保证下一个读操作从一个新线开始。
它还使得为重复输入请求添加错误处理更简单。
EG
#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 >>
传递换行符(\n)
。 getline()假定换行符是空格并传递它。有人发布了一个可以使用的解决方案。
你可以使用虚拟getline(cin, dummy);
或真正的cin.ignore(100,'\n');
cin >> number
只从缓冲区中获取数字,它在缓冲区中留下“输入”,然后由getline立即抓起并解释为空字符串(或者只是新行的字符串,我忘了)。
不要使用getline()
:这对内存分配来说是件坏事。使用fgets()
。见fgets
reference。