如果do while循环中的语句带有yes或no结尾[duplicate]?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (54)

这个问题在这里已有答案:

我是编码的新手,我正在尝试do while使用嵌套if语句进行长循环,但是我遇到了让循环实际循环的问题。

我没有直接获得有关代码很长的项目的帮助,而是制作了一个简单的版本。它也不循环。它将结束并询问用户是否要再次尝试但是当输入“y”时它忽略if语句。

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string sodaChoice;
    char answer = 'n';

    do
    {
        cout << "Please choose your favorite soda from the following: Rootbeer, Diet Coke, Coke, Sprite" << "\n";
        getline(cin, sodaChoice);

        if (sodaChoice == "Rootbeer")
        {
            cout << "Me too!" << "\n";
        }
        else if (sodaChoice == "Diet")
        {
            cout << "Not me :(" << "\n";
        }
        else if (sodaChoice == "Coke")
        {
            cout << "It's alright" << "\n";
        }
        else if (sodaChoice == "Sprite")
        {
            cout << "only if I'm sick" << "\n";

        }
        else
        {
            cout << "That was not on the list";
        }
        cout << "would you like to try again?";
        cin >> answer;



    } while (answer == 'y'|| answer == 'Y');




    return 0;
}

我想也许我需要围绕if语句的do循环中的do循环,但后来我不知道如何去做。任何帮助,将不胜感激。我花了很多很多时间试图解决这个问题。

我试着问我的老师,但是我的大学从一些通用课程中教导他们的院长根据她的书写。他对帮助或教学不是很热心。

编辑:谢谢大家的答案!至于这是一个重复的问题,我还没有学过cin.ignore,所以我不知道它与我的问题有关。谢谢大家教我!

提问于
用户回答回答于

在用户表现良好并仅输入'y'或'n'后跟换行符的情况下,现有答案是正确的。

我们可以通过要求它忽略包括下一个换行符在内的所有字符来添加一点安全性来修改.ignore()调用:

您需要在翻译单元的顶部添加此标头包含:

#include <limits>

你需要在之前添加这一行cin >> answer

// consumes and ignores as many characters as necessary until a newline. 
// The newline is also consumed.
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

这里有完整的测试输入程序:

http://coliru.stacked-crooked.com/a/996e77559590ad6d

不幸的是,计算机科学教师对计算机科学一无所知并不罕见。不要担心这一点,或者让它让你不去学习如何编写软件 - 这只是一个好的软件工程师比优秀的教师获得更多报酬这一事实的症状。

以下是一些有用的参考资料:https//en.cppreference.com/w/cpp/io/basic_istream/ignore

用户回答回答于

cin >> answer;

你只读了一个字。问题是你在写答案时输入了至少两个字符。实际'y''n' 的Enter键,其中加入作为在输入缓冲器换行。

然后,下一个getline调用将该换行读取为空行。

这个问题有一些解决方案,例如ignore在阅读之后使用answer。或者,如果你想只有一个字的输入,那么你可以使用使用格式化输入>>sodaChoice过,因为它会默认跳过前导空格(如新行)。

所属标签

可能回答问题的人

  • 人生的旅途

    10 粉丝484 提问5 回答
  • 无聊至极

    4 粉丝504 提问5 回答
  • 富有想象力的人

    4 粉丝0 提问4 回答
  • 嗨喽你好

    7 粉丝480 提问4 回答

扫码关注云+社区

领取腾讯云代金券