输入一个数字(例如,年龄)后,我读取了一个字符串(例如,名字和姓氏),但结果我得到了一个额外的空行。它来自哪里以及如何摆脱它?
例如,
struct Person
{
char firstname[20];
char lastname[20];
int age;
};
Person p;
cin >> p.age;
cin.getline(p.firstname,20);
cin.getline(p.lastname,20);
之后,一个p.firstname
空字符串出现在 中,并p.lastname
输入了 for p.firstname
。
尝试使用 C 函数时也是如此
scanf("%d",&p.age);
fgets(p.firstname,10,stdin);
fgets(p.lastname,10,stdin);
这样的读取问题通常是由于在格式读取之后,例如,执行了行读取。未包含在格式数据中的字符(通常是换行符)保留在输入缓冲区中,并在下一次读取时作为 [empty] 字符串读取。
这就是这种无效的C 代码的样子:
(当然,这同样适用于键盘输入 - 类似
scanf("%d",&intVar)
)。或者在 C++ 中:
可能还有其他选择。
解决方法(如果您不更改逻辑和读取功能本身,当然,这也是可能的)是刷新输入缓冲区 - 忽略格式输入和输入之间的行尾的所有字符下一行。
在 C++ 中,这可以通过以下代码来完成(这意味着忽略所有字符,
'\n'
包括在内):在 C 中,您可以显式计算并忽略直到字符串末尾的所有字符:
(当然,检查读取错误也很有意义 - 读取的字符不等于
EOF
。从键盘读取时,您可以简单地使用stdin
而不是file
,您可以 -getchar()
。)C中的另一种选择-
最简单的:
那些。只需添加cin.get(); 格式输入后。此调用将吃掉输入缓冲区中不需要的换行符。