![](/img/trans.png)
[英]Why is cin.ignore() ignoring the first character of my getline input?
[英]getline removes first character; removal of cin.ignore(); does not resolve
int main()
{
for (int i = 0; i < 4; ++i)
{
cout << "Please enter Employee #" << (i+1) << "'s" << " name: ";
cin.ignore();
getline(cin, employee[i].employeeName);
cout << "Please enter Employee #" << (i+1) << "'s hours worked: ";
cin >> employee[i].hoursWorked;
cout << "Please enter Employee #" << (i+1) << "'s hourly rate: ";
cin >> employee[i].hourlyRate;
cout << "Please enter Employee #" << (i+1) << "'s Federal Tax Rate: ";
cin >> employee[i].fedtaxRate;
cout << "Please enter Employee #" << (i+1) << "'s State Tax Rate: ";
cin >> employee[i].statetaxRate;
cout << endl;
}
正如标题所说,我目前有cin.ignore();
帮助接收像“Barkley, Charles”这样的全名(它做得很好,除了它在打印时截断了第一个字符,留下“arkley, Charles”)但是当我删除cin.ignore();
,就像 99% 已回答的 StackOverflow 问题一样,没有任何反应。 事实上,情况更糟:在第二个循环中,它会将第二个循环的第二行放在第二个循环的第一行。 这只是一团糟。 哦, cin.getline
也不起作用。 我尝试将其与cin.sync
结合使用,但没有使用骰子。 普通的普通老香草cin >>
在第一行问题上导致相同的第二行。 我不知道该怎么办。 我还没有找到一篇涵盖这个(看似)边缘情况的 SO 文章。 谢谢您的帮助。
与许多输入问题一样,问题的存在是因为您混合了基于行和基于项目的输入。
将会发生的是最终的cin >> employee[i].statetaxRate;
将使流指针立即指向其类型的最后一个有效字符之后的位置。
这很可能是行尾的换行符,因此,当您返回获取下一个名称(没有cin.ignore
)时,它会将其读作空行。
您可能认为可以通过将cin.ignore
放在循环末尾来修复它,但您可能会遇到其他问题。 具体来说,由于该表单只是跳过一个字符,因此输入:
123<space><newline>
将简单地跳过<space>
并且您将遇到完全相同的问题。
一个快速的解决方法是简单地用类似的东西(在循环的末尾)读取整行的其余部分:
{
std::string junk;
getline(cin, junk);
}
这将准备输入流,以便您处于下一行的开头。
另一种可能性(这是首选,因为您第一次输入abc
它期望一个数字会让您感到悲伤)是将所有项目作为行读取,然后使用字符串处理将它们放入数字变量中,例如strtod()
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.