- 内容提要
- 前言
- 第 1 章 预备知识
- 第 2 章 开始学习 C++
- 第 3 章 处理数据
- 第 4 章 复合类型
- 第 5 章 循环和关系表达式
- 第 6 章 分支语句和逻辑运算符
- 第 7 章 函数——C++的编程模块
- 第 8 章 函数探幽
- 第 9 章 内存模型和名称空间
- 第 10 章 对象和类
- 第 11 章 使用类
- 第 12 章 类和动态内存分配
- 第 13 章 类继承
- 第 14 章 C++中的代码重用
- 第 15 章 友元、异常和其他
- 第 16 章 string 类和标准模板库
- 第 17 章 输入、输出和文件
- 第 18 章 探讨 C++新标准
- 附录 A 计数系统
- 附录 B C++保留字
- 附录 C ASCII 字符集
- 附录 D 运算符优先级
- 附录 E 其他运算符
- 附录 F 模板类 string
- 附录 G 标准模板库方法和函数
- 附录 H 精选读物和网上资源
- 附录 I 转换为 ISO 标准 C++
- 附录 J 复习题答案
6.7 读取数字的循环
假设要编写一个将一系列数字读入到数组中的程序,并允许用户在数组填满之前结束输入。一种方法是利用 cin。请看下面的代码:
如果用户输入一个单词,而不是一个数字,情况将如何呢?发生这种类型不匹配的情况时,将发生 4 种情况:
- n 的值保持不变;
- 不匹配的输入将被留在输入队列中;
- cin 对象中的一个错误标记被设置;
- 对 cin 方法的调用将返回 false(如果被转换为 bool 类型)。
方法返回 false 意味着可以用非数字输入来结束读取数字的循环。非数字输入设置错误标记意味着必须重置该标记,程序才能继续读取输入。clear( ) 方法重置错误输入标记,同时也重置文件尾(EOF 条件,参见第 5 章)。输入错误和 EOF 都将导致 cin 返回 false,第 17 章将讨论如何区分这两种情况。下面来看两个演示这些技术的示例。
假设要编写一个程序,来计算平均每天捕获的鱼的重量。这里假设每天最多捕获 5 条鱼,因此一个包含 5 个元素的数组将足以存储所有的数据,但也可能没有捕获这么多鱼。在程序清单 6.13 中,如果数组被填满或者输入了非数字输入,循环将结束。
程序清单 6.13 cinfish.cpp
注意:
本书前面说过,在有些执行环境中,为让窗口打开以便能够看到输出,需要添加额外的代码。在这个示例中,由于输入‘q’结束输入,处理起来更复杂些:在程序清单 6.13 中,如果要让程序在结束循环后接收输入,也可使用类似的代码。
程序清单 6.14 更进了一步,它使用 cin 来返回值并重置 cin。
程序清单 6.13 中的表达式 cin>>fish [i]实际上一个是 cin 方法函数调用,该函数返回 cin。如果 cin 位于测试条件中,则将被转换为 bool 类型。如果输入成功,则转换后的值为 true,否则为 false。如果表达式的值为 false,则循环结束。下面是该程序的运行情况:
请注意下面的代码行:
前面讲过,如果逻辑 AND 表达式的左侧为 false,则 C++将不会判断右侧的表达式。在这里,对右侧的表达式进行判定意味着用 cin 将输入放到数组中。如果 i 等于 Max,则循环将结束,而不会将一个值读入到数组后面的位置中。
当用户输入的不是数字时,该程序将不再读取输入。下面来看一个继续读取的例子。假设程序要求用户提供 5 个高尔夫得分,以计算平均成绩。如果用户输入非数字输入,程序将拒绝,并要求用户继续输入数字。可以看到,可以使用 cin 输入表达式的值来检测输入是不是数字。程序发现用户输入了错误内容时,应采取 3 个步骤。
1.重置 cin 以接受新的输入。
2.删除错误输入。
3.提示用户再输入。
请注意,程序必须先重置 cin,然后才能删除错误输入。程序清单 6.14 演示了如何完成这些工作。
程序清单 6.14 cingolf.cpp
下面是该程序的运行情况:
程序说明
在程序清单 6.14 中,错误处理代码的关键部分如下:
如果用户输入 88,则 cin 表达式将为 true,因此将一个值放到数组中;而表达式!(cin >> golf [i]) 为 false,因此结束内部循环。然而,如果用户输入 must i?,则 cin 表达式将为 false,因此不会将任何值放到数组中;而表达式!(cin >> golf [i]) 将为 true,因此进入内部的 while 循环。该循环的第一条语句使用 clear( ) 方法重置输入,如果省略这条语句,程序将拒绝继续读取输入。接下来,程序在 while 循环中使用 cin.get( ) 来读取行尾之前的所有输入,从而删除这一行中的错误输入。另一种方法是读取到下一个空白字符,这样将每次删除一个单词,而不是一次删除整行。最后,程序告诉用户,应输入一个数字。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论