【问题标题】:getline removes first character; removal of cin.ignore(); does not resolvegetline 删除第一个字符;删除 cin.ignore();不解决
【发布时间】:2017-01-31 07:56:45
【问题描述】:
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 &gt;&gt; 在第一行问题上导致相同的第二行。我不知道该怎么办。我还没有找到涵盖这个(看似)边缘案例的 SO 文章。谢谢您的帮助。

【问题讨论】:

  • 假设ignore调用是在最后一个输入之后读取并丢弃换行符,那么将它放在循环的end怎么样?
  • 太棒了。谢谢你,伙计。
  • getline 不会删除第一个字符。 之前调用删除它。在那个电话之前,唯一触及std::cin 的是对ignore() 的电话。

标签: c++ cin getline truncation


【解决方案1】:

与许多输入问题一样,存在问题是因为您混合了基于行和基于项目的输入。

最终的结果是cin &gt;&gt; employee[i].statetaxRate; 将使流指针指向紧随其类型的最后一个有效字符之后的位置。

这很可能是行尾的换行符,因此,当您返回获取下一个名称(没有cin.ignore)时,它将读取为空行。

您可能认为可以通过将cin.ignore 放在循环末尾来解决它,但您可能会遇到其他问题。具体来说,由于该表单只是跳过一个字符,因此输入:

123<space><newline>

将简单地跳过&lt;space&gt;,您将遇到完全相同的问题。

一个快速的解决方法是简单地读取整个行的其余部分,例如(在循环结束时):

{
    std::string junk;
    getline(cin, junk);
}

这将准备输入流,因此您处于下一行的开头。


另一种可能性(这是首选,因为您第一次输入 abc 时预计数字会导致您悲伤)是将您的项目所有读取为行,然后使用字符串处理以将它们放入数字变量中,例如strtod()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-19
    • 2011-06-24
    • 2011-05-29
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多