为了账号安全,请及时绑定邮箱和手机立即绑定

求解以下代码,当输入的值是A B C时,请解释一下为什么结果是这样?

求解以下代码,当输入的值是A B C时,请解释一下为什么结果是这样?

iOS C
皈依舞 2021-12-31 02:59:23
#include <iostream>#include <iomanip>using namespace std;int main(){int a;char b;float c;cin>>a>>b;cin.get(c);cout <<"a="<<a<<setw(20)<<"b="<<b<<setw(20)<<"c="<<c<<endl;}
查看完整描述

2 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

C++的输入错误检查机制:

1、在C++中有三个位用来设置错误的状态信息,iso::eofbit当文件到达末尾时则设置该位。ios::badbit当流被破坏时设置该位,这是不可恢复的,比如文件读取错误。ios::failbit如果输入操作未能读取到预期的字符或输出操作没有写入预期的字符则设置该位,这是可恢复的。这三个状态标志设置了不同类型的输入错误

2、为什么需要重设流状态呢?因为一旦流状态的其中某一位被设置后,则流将对后面的输入或输出关闭,直到流状态被清除。比如cin>>a;其中a是int型变量,如果这时输入一个字符d,则会出现设置流状态failbit位,这可以通过调用good()函数来测试,这时对后面的输入将会关闭,也就是说如果cin>>a;后面还有一句cin>>b;则语句cin>>b将不会执行。
3、如果希望程序在流状态位被设置后能够读取后面的输入,则必须将流状态重置为良好。这可以使用clear()方法来实现。比如cin>>a; cin.clear(); cin>>b;其中变量a是整型。这时如果输入一个字符d语句cin>>a将使程序设置failbit位,语句cin.clear()将状态位failbit位清除,接着执行语句cin>>b,这时会发现程序cin>>b;没有提示输入,这是为什么呢?原因就在于虽然使用clear()函数重置了流状态,但是不匹配的输入仍然留在输入队列中,下一次输入就将从这里读起,而不会提示用户输入内容,而是从输入流中直接提取,也就是说字符d会直接赋给变量b;如果变量b是字符型的话则接收他,并把字符d赋给b,这里不会提示输入变量b的值,这不是我们所预期的。如果变量b是整型变量的话,则cin>>b又将是错误的。怎样能在第一次输入错误后让系统提示用户为以后的输入语句输入内容呢?方法就是使用一个函数来一直读取输入流中的字符直到达到空白为止,这可以使用isspace()函数和ignore()函数来实现,篇符所限不讲了。

4、使用cin进行简单输入:cin是类istream的对象。对于cin输入,它将跳过空白(空格,换行符和制表符)直到遇到非空白字符,cin将读取从非空白字符到与目标类型不匹配的第一个字符之间的全部内容。比如有cin<<a;其中a是int,则输入123 z x时,则只把123赋给变量a,而后面的z x则留在输入流中,下一次输入时就将从这里开始读取,比如再有cin<<b;其中b是char型,则字符z将赋给变量b,这里不会提示输入变量b的值,这不是我们所预期的,而字符x又将留在输入流中,在这里不会读取z前面的空白字符,正如前面所说cin输入将跳过空白直到遇到非空白字符起才开始读取。再比如cin<<a;其中a是int,则当输入3 2 1时,则只有数字3被赋给变量a,因为在数字3后面的空格是与类型int不匹配的类型,在这里就结束输入。如果再输入时输入3.3这样的数字的话,则同样的道理,在程序中点符号对于整型来说是非匹配类型,所以只有数字3被输入给变量a,则后面的字符被留在输入流中。

顺便提一下,你程序中的cin.get(c)对于float类型与C++中的get函数原型中的形参根本就不皮配,使用VC不能通过编序,不知道你的编译器怎么能编译通过的。


查看完整回答
反对 回复 2022-01-03
?
SMILET

TA贡献1796条经验 获得超4个赞

你这代码不对吧那个get()函数原型是get(char &),你这变量“c"是个 float变量,这句cin.get(c);就编译不过去吧~

查看完整回答
反对 回复 2022-01-03
  • 2 回答
  • 0 关注
  • 374 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号