C++中将输入条件作为循环判断条件的问题

主要代码如下:
int a;
while(cin>>a)
cout<<a;
在运行时,当我输入“2.1”,即不是输入整型时,仍然会输出“2”这个整型数据,随后结束进程。而当我输入字符“a”时,是直接结束进程,没有任何输出。请问这是为什么?

这个 google下就知道了。

首先,cin是个对象,没有所谓返回
>>输入操作符返回流对象的引用,cin >> x 返回istream&,cout << x返回oostream&

if可直接判断流,如if (cin)
while间接判断,如while (cin >> x)
若流被标记错误(读取失败)就返回false.
ctrl+z,F6可跳出循环,这代表eof(文件结束符)

在ios,istream和ostream类中,还定义了若干输入输出函数,它们主要用于错误处理,流的刷新以及流输入输出方式的控制.
错误处理
在对一个流对象进行I/O操作时,可能会产生错误。当错误发生时,错误的性质被记录在ios类的一个数据成员中。

ios类中定义的描述错误状态的常量:
goodbit-------------没有错误,正常状态 
eofbit--------------到达流的结尾
failbit-------------I/O操作失败,清除状态字后,可以对流继续进行操作。
badbit--------------试图进行非法操作,清除状态字后,流可能还可以使用。
hardfail------------致命错误,不可恢复的错误。
对应于这些位,可用ios中定义的如下函数来检查流的当前状态位:
int good()---------如果正常,返回非0值
int bad()----------如果badbit被设置,返回非0值
int eof()----------如果eofbit被设置,返回非0值
int fail()---------如果failbit被设置,返回非0值
int rdstate()------返回当前错误状态位.

流的其它成员函数可以从流中读取字符或字符串,对流进行无格式化的输入 输出操作,以及直接控制对流的I/O操作。

返回类型 ostream类的成员 描      述
ostream& put(char ch) 向流中输出一个字符ch,不进行任何转换
ostream& write(char*,int) 向流中输出指定长度的字符串,不进行转换
ostream& flush( ) 刷新流,输出所有缓冲的但还未输出的数据
ostream& seekp(streampos) 移动流的当前指针到给定的绝对位置
ostream& seekp(sereamoff,seek_dir) 流的当前指针类似与文件的当前指针
streampos teelp( ) 返回流的当前指针的绝对位置

istream类的成员函数

返回类型 istream类的成员 描       述
int get( ) 读取并返回一个字符
istream& get(char&c) 读取字符并存入c中
istream& putback( ) 将最近读取的字符放回流中
istream& read(char*,int) 读取规定长度的字符串到缓冲区中
int peek( ) 返回流中下一个字符,但不移动文件指针
istream& seekg(streampos) 移动当前指针到一绝对地址
istream& seekg(streampos,seek_dir) 移动当前指针到一相对地址
streampos tellg( ) 返回当前指针追问

谢谢你这么热心。不过,貌似这堆参考答案并没有正面解答我的问题。我只想知道为什么我在运行时会出现那种情况。

追答

要解决这个问题,需要深入c++内部了。
但是可以简单理解一下:
无论你输入的什么,其实都是字符串。
2.1时,读取字符串“2.1”,解析字符串,2 没问题,输出。"."检测不符合int类型,错误,退出。
“a”检测类型错误,退出。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-06-15
首先你必须明白 while() 括号里必须是一个判断语句(或者是一个bool型的变量,即0,1或者false,true,判断语句的返回值其实也是这样一个变量),而cin>>是一个无返回值的函数,所以它总是成立的,所以不管你输入什么数,都会执行下面的语句。但是输入字符和输入数字不一样,c++有自己的出错处理,输入数字的时候它可以通过舍入或者添加来赋不同的数据类型,但是输入字符的时候就没办法转换成数字了,所以就出错直接退出了
第2个回答  2011-06-13
需要你的全部代码才能解答追问

#include
using namespace std;
int main()
{
int a;
while(cin>>a)
cout<<a<<endl;
return 0;
}

全部代码就这么简单,我只想知道,为什么以错误的形式输入,(即要求输入一个整型,而我输入了一个浮点型),仍然会有结果输出?

追答

键盘是以字符形输入的,程序会判断的,所以浮点型的数据是以"."结束,所以前面的值也存在的

C++中将输入条件作为循环判断条件的问题
首先,cin是个对象,没有所谓返回 >>输入操作符返回流对象的引用,cin >> x 返回istream&,cout << x返回oostream& if可直接判断流,如if (cin)while间接判断,如while (cin >> x)若流被标记错误(读取失败)就返回false.ctrl+z,F6可跳出循环,这代表eof(文件结束符)在ios,istream和ostream...

c++ 将是否输入 作为判断条件
你的输入是指stdin的输入么,如果是的话,你可以在循环里面对stdin做poll或者select,在没有输入的时候可以继续循环有的话可以读取输入比较是否是!即可 你的程序可以这么写 char c;int fd = fileno(stdin);int val = fcntl(fd, F_GETFL, 0);val |= O_NONBLOCK;fcntl(fd, F_SETFL, val); ...

c++如何编程使得输入ctrl+z时使一个循环结束
判断条件写为:while((c=getchar())!=EOF);就可以用ctrl+z结束循环了 C语言中,EOF即文档的结尾.但是,当你写一个小程序,并以EOF作为判断条件时,就无法输入文档的结尾了,只能人工输入一个,这个人工输入的文档结尾就是Ctrl+Z 比如:include <stdio.h> int main(){ int c;do { printf("请输入...

C++中要输入一个整数到变量x,我输入一个字母后便无限循环了,怎么才能知 ...
这个简单,你只要在输入语句下一句,添加一个判别函数isalpha(a)就可以了,这个函数是自带的,用来判别变量a是否是字母,cin>>n;while(isalpha(n)){cout<<"输入是字母!"<<endl;cin>>n;}另外isdigit(n)就是判断n是否为数字。

c++中如何判断真假然后确定是否继续循环
可以在循环体里加上一个判断语句,然后用break语句跳出循环。比如下面这个while循环中(函数调用忽略),就用到判断,然后break跳出循环。int main(){ int x,k=1;cout<<"输入待判定的正整数:";cin>>x;while (k<=gn(x)\/2){ int temp_1=(x\/fn(k-1))%10;int temp_2=(x\/fn(gn(x)-k...

c++这个while循环里面的判断条件是什么意思啊?
理解C++中while循环里的判断条件,首先需要了解istream::operator>>的文档内容。遗憾的是,知乎存在链接识别错误问题,无法直接展示operator>>链接。通常,通过使用istream::operator>>,我们可以从输入流读取数据。关键在于,这个操作后返回的仍然是一个istream对象。这意味着,我们需要将istream转换为bool...

c加加多种数测试数据怎么写
写法如下:方法一:使用C语言的的方法,把输入语句作为while循环的判断条件,当输入数据不是文件结束符(EOF)的时候,就可以实现连续输入。方法二是用C++for循环实现,将输入语句作为for循环的condition部分,而expression部分省略不写,因为条件部分能改变i的值,所以这个循环无需表达式部分,其中,条件部分不...

c++中if条件语句下,如何表示输入结束
C++的输入操作符会返回它所读的数据流,所以判断是否是输入结束,判断cin操作的返回对象就可以了,一般是用while语句判断:int value;while(std::cin>>value)这里是循环输入,当遇到无效输入或者输入一个EOF输入就结束,无效输入在这里是除了整数以外的输入(因为value是int型),EOF在Windows上是Ctrl+Z,...

c++编程问题 (关于cin的)
第一个cin是用户第一次输入的值,但是你要统计用户输入的正负的个数,那必然是输入多个值。所以在while循环里面的末尾添加cin的作用就是 用户以后输入的值了,知道用户输入0则停止。在while里cin>>n n的值就改变了,那么while()就会触发,进而判断是否满足条件。第二个cin是不指定次数循环进行的必要...

cpp 如何判断输入结束?
EOF是c里得东西,如果是c++可以这样:include<iostream> using namespace std;int main(){ int a,b;while(cin>>a>>b)\/\/以输入做循环条件,输入结束则自动跳出循环 cout<

相似回答