【问题标题】:getline function not working with multiple string input [duplicate]getline函数不适用于多个字符串输入[重复]
【发布时间】:2012-09-19 07:23:18
【问题描述】:

可能重复:
Need help with getline()

我正在尝试将 getline 函数与 cin 结合使用以从键盘获取输入,但我的代码跳过了 getline 语句,而是继续执行下面的 cin 函数。这是我的代码和正在发生的事情的屏幕截图。

void addmovie(ofstream& MovieContentsFile) {

string movieTitle;
int movieQuantity;

cout << " \n Add Movie Selected \n " << endl;

cout << "Please type in the movie title and press enter \n" << endl;

getline(cin,movieTitle, '\n');

cout << "Movie: " << movieTitle << "Please type in the amount of copies we have of this movie \n " << endl;

cin >> movieQuantity;

我希望能解释一下为什么会发生这种情况以及将来如何避免这种情况

【问题讨论】:

    标签: c++ visual-studio-2010 visual-c++


    【解决方案1】:

    cin &gt;&gt; something 将尾随换行符留在缓冲区中,下一个cin &gt;&gt; something_else 将忽略该换行符(大概这就是您阅读菜单选项的方式)。但是,getline 获取 所有内容 直到并包括缓冲区中的下一个换行符,而不是忽略空格。 IE。在这种情况下它什么也得不到(嗯,只是换行符)。

    一般情况下最好不要同时使用两者,这样会有点乱。

    编辑:澄清一下,getline 将从缓冲区中删除最后一个换行符,但不会将其存储在您的 string 中。

    【讨论】:

    • 我使用 switch case 语句进行菜单选择,仅供参考。所以你会建议严格使用 ether getline 或 cin?
    • switch/case 适用于根据输入选择要运行的函数,但与您实际获取该输入的方式无关。一般来说,最好只使用&gt;&gt;getline 中的一个,但不能同时使用两者。同时处理这两个问题很痛苦。
    【解决方案2】:

    这是因为换行符仍在缓冲区中,所以当它到达 getline 时,它​​会看到它并跳过它。为避免这种情况,您可以在之前的行中放置类似cin.ignore(25, "\n") 的内容。这将忽略 25 个字符,直到它到达换行符,然后它也需要它。

    【讨论】:

      猜你喜欢
      • 2012-08-24
      • 2016-07-13
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      相关资源
      最近更新 更多