有人可以向我解释一下这段代码是如何工作的吗?(如果需要数字值并且用户输入其他输入,则程序再次要求用户输入)

2024-03-22

我正在读一本关于 C++ 的书(C++ Primer Plus)并找到了这段代码。

该程序的目的是,如果用户希望将数字输入读取到,例如数组->

1)将cin重置为新输入
2)摆脱错误的输入
3)提示用户重试(书上原话)

这是代码->(从书中复制的确切代码)

#include <iostream>
const int Max=5;
int main()
{
    using namespace std;

    //get data
    int golf[Max];
    cout<<"please enter your golf scores.\n";
    cout<<"you must enter "<<Max<<" rounds.\n";
    int i;
    for(i=0;i<Max;i++) {
        cout<<"round #"<<i+1<<": ";
        while(!(cin>>golf[i])) {
            cin.clear();
            while(cin.get()!='\n')
                continue;
            cout<<"PLease enter a number: ";
         }
    }
    double total=0.0;
    for(i=0;i<Max;i++)
        total+=golf[i];

    cout<<total/Max<<" = average score "<<Max<<" rounds\n";
    return 0;
}

我不明白的特定部分是:

cin.clear();
while(cin.get()!='\n')
continue;

我对功能有点不清楚cin.clear(),需要continue这里,以及 while 测试条件的作用以及它是如何工作的。

试运行->

(斜体部分为用户输入)

请输入您的高尔夫球成绩。
您必须参加 5 轮.
第1轮: 88
第二轮: 87
第三轮: duh
请输入一个数字: 103
第四轮: 94
第五轮: 86
91.6 = 5轮平均分


while(!(cin>>golf[i]))

 {

    cin.clear();
    while(cin.get()!='\n')
        continue;


    cout<<"PLease enter a number: ";

 }

首先我们以 while 条件为例。它似乎检查表达式的值(cin >> golf[i]) 是假的。的价值cin >> golf[i] is cin本身。那么怎么可能是假的呢?如果输入流的>>操作失败,则会设置一个名为fail的标志。这就是运营商!检查。所以条件意味着在尝试读取对象 cin 已失败设置的数字后,执行...

现在,一旦设置了失败标志,您就无法对输入流执行太多操作。除非重置失败标志,否则您将无法继续从流中读取数据。就是这样cin.clear() does.

然后,它通过逐字符读取直到到达行尾来咀嚼错误输入行的其余部分(自 >> 失败以来,该输入行未被消耗)。

最后它提示用户输入新的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有人可以向我解释一下这段代码是如何工作的吗?(如果需要数字值并且用户输入其他输入,则程序再次要求用户输入) 的相关文章

  • 在 Web 浏览器中禁用 F5 [重复]

    这个问题在这里已经有答案了 可能的重复 禁用浏览器的后退按钮 https stackoverflow com questions 961188 disable browsers back button 如何禁用浏览器上的 F5 刷新 htt
  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • 从另一个 FORM 中取回隐藏的 FORM

    我有两种形式Form1 and Form2 我正在打开Form2 from Form1 on button Click Form2 obj2 new Form2 this Visible false obj2 Show 然后我想回来Form
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • libtool 在 Ubuntu 13.04 上构建 thrift 0.9.1 时出错

    在 Ubuntu 13 04 上构建 thrift 0 9 1 支持 C C java C perl python 时出现此错误 configure 不带任何选项运行 make 不带任何选项运行 Making all in test mak
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • 为什么 C# 中同一类型的隐式和显式运算符不能共存? [复制]

    这个问题在这里已经有答案了 为什么同一类中两个相同类型的运算符 显式和隐式 不能共存 假设我有以下内容 public class Fahrenheit public float Degrees get set public Fahrenhe
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • 名称查找、实例化点 (POI) 和基本类型

    以下代码针对 X 进行编译 但不适用于 double struct X void foo double void foo X namespace NN struct A void foo A foo double error foo not
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 测验;这个编译了吗?如果是的话它会返回什么(我知道答案)

    我最近发现这个错字 if name find string npos 显然开发者的意思是输入 if name find string npos 但令我惊讶的是发现错误甚至编译 Wall Werror 没有尝试过 pedantic 那么 咖啡
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 将日期时间显示为 MM/dd/yyyy HH:mm 格式 C#

    在数据库中 日期时间以 MM dd yyyy HH mm ss 格式存储 但是 我想以 MM dd yyyy HH mm 格式显示日期时间 我通过使用 String Format 进行了尝试 txtCampaignStartDate Tex
  • 值和类型的简洁双向静态 1:1 映射

    我将从我想象如何使用我想要创建的代码开始 它不必完全像这样 但它是我在标题中所说的 简洁 的一个很好的例子 就我而言 它是将类型映射到相关的枚举值 struct bar foo

随机推荐