繁体   English   中英

getline 删除第一个字符; 删除 cin.ignore(); 没有解决

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM