cin >> a >> b的操作问题

BEN1978 2006-06-13 11:17:01
int a;
int b;
while (1)
{
cin >> a >> b;
if (a < 1 || b < 1)
continue;
else
break;
}

当输入数字时,会正常跳出循环,而输入字符如 a b时,会无限循环下去,且不会接受键盘输入。
是cin的buffer没有清空吗?要如何操作才能解决这种问题呢?初学流的操作,请DX指正!
...全文
1433 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
0黄瓜0 2006-06-15
  • 打赏
  • 举报
回复
triace_zhang(『雪梨码头』精确碰撞检测焦头烂额中)
的代码要使用标准头文件,否则死循环。

下面给一个非标准头文件的


#include <iostream.h>
int main()
{
int a;
int b;

bool flag=true;//为了输入如-1 0还能重新循环
while (!(cin >> a >> b)//如果输入字符重新循环
|| flag)
{
if (a < 1 || b < 1)
{
cout<<"输入有误,重新输入:"<<endl;
cin.clear();
cin.ignore(10,'\n' );
//cin.sync();
}
else
break;
}
//system("pause");
cout<<a<<" "<<b<<endl;
return 0;
}

suifeng19 2006-06-15
  • 打赏
  • 举报
回复
因为上次输入的流有错误没有清除错误状态也没有清空缓冲区,这样错误流就会传值给cin>>b;
也会产生错误而退出,即m还是0.可以这样改一下:
#include <iostream>
using namespace std;
void main()
{
int a,b;
int n = 0 , m = 0;
char buf[80];

while (cin >> a)
++n;
cin.clear();//清楚错误状态
cin.getline(buf,80);//清空缓冲区,将缓冲区的流传给buf来达到清空

while (cin >> b)
++m;

}
BEN1978 2006-06-15
  • 打赏
  • 举报
回复
A_B_C_ABC(黄瓜) triace_zhang(『雪梨码头』精确碰撞检测焦头烂额中) suifeng19() 的方法试验通过
谢谢大家的讨论

吃狼的豆腐 2006-06-15
  • 打赏
  • 举报
回复
要清除错误标志的
拿节 2006-06-14
  • 打赏
  • 举报
回复
int a;
cin>>a;当输入不是整型时,将会导致输入错误,
可以对输入对象进行测试,这时cin==FALSE;
同意楼上用while(cin>>a>>b)对输入的正确性与否进行判断
sankt 2006-06-14
  • 打赏
  • 举报
回复
一样的道理:

#include<iostream>
using namespace std;

int main()
{

int a;
int b;
while (cin >> a >> b)
{

if (a < 1 || b < 1)
continue;
else
break;
}
system("pause");
return 0;
}
sankt 2006-06-14
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int main()
{
cout << "Enter a number, or -1 to quit: ";
int i = 0;
//查合法输入的一个简单方法是将输入请求从 while 循环体中移到 while
//循环的控制表达式.

while (cin >> i)
{ // 良好的形式
if (i == -1) break;
cout << "You entered " << i << '\n';
}
system("pause");
return 0;

}
rabbit729 2006-06-14
  • 打赏
  • 举报
回复
to LZ:将cin.get()改为cin.clear()试一下
BEN1978 2006-06-14
  • 打赏
  • 举报
回复
rabbit729(无名胜有名)的方法试过了,没什么效果。

cin >> a;
cin >> b;
cin >> c;

if (a < 1 || b < 1 || c < 1) continue;

输入a时,键入 a
将直接跳过后面bc的输入,进行循环。
BEN1978 2006-06-14
  • 打赏
  • 举报
回复
这个问题感觉不简单了
rabbit729 2006-06-14
  • 打赏
  • 举报
回复
这里主要是由于cin在接收字符时遇到空白符(回车、空格、制表符等)时就停止接收字符,并且将空白符留在缓冲区中。所以此处输入a b时,a能够输入并且被接收,但是紧接着试一个空格cin就停止了,并且b遇到的第一个字符就是空格所以无法接收字符。此处改正如下:
int a;
int b;
while (1)
{
cin >> a;
cin.get();
cin>>b;
if (a < 1 || b < 1)
continue;
else
break;
}

程序没有调试,LZ试一下行不?
triace_zhang 2006-06-14
  • 打赏
  • 举报
回复
new_o_new() ( ) 信誉:100
楼上triace_zhang(『雪梨码头』精确碰撞检测焦头烂额中) 的代码我试了!输如字符就有:
please input two numbers again!
please input two numbers again!
please input two numbers again!
please input two numbers again!
...
呵呵 ~
=============================================================
你用的什么编译器,我在vc6和dev c++上都没有问题.
BEN1978 2006-06-14
  • 打赏
  • 举报
回复
UPCC(杂食动物) 的意思明白,有什么方法可以解决呢,就是经过一次循环后,等待键盘输入,而不是跳过cin语句。 换句话说,就是怎么清空cin的buffer,不知道这样的说法是否正确。

ftkghost(小鹏) 的说法试过了,不管用。
new_o_new 2006-06-14
  • 打赏
  • 举报
回复
int a;
int b;

while ( !(cin >> a >> b) && !(a < 1 || b < 1))
{

cin >> a >> b;

}
system("pause");
return 0;



我这个对输入字符还是不行!因为我也不知道(!(cin >> a >> b))在输入不同的时候的返回值是什么?对封装进去的东西我知道!难道就不能把这个“(!(cin >> a >> b))”判断条件在while外边判断一次吗?用什么方法就不一定了~
new_o_new 2006-06-14
  • 打赏
  • 举报
回复
楼上triace_zhang(『雪梨码头』精确碰撞检测焦头烂额中) 的代码我试了!输如字符就有:
please input two numbers again!
please input two numbers again!
please input two numbers again!
please input two numbers again!
...
呵呵 ~
new_o_new 2006-06-14
  • 打赏
  • 举报
回复
按照:
本义是要从键盘输入a、b
如果输入的是输入,则跳出循环
如果输入非数字,则返回重新输入
我把楼上的sankt(黄景天) 的代码改成这样子了,但是还是不行!
#include<iostream.h>
#include <stdlib.h>
//using namespace std;

int main()
{

int a;
int b;
while (!(cin >> a >> b))
{

cin >> a >> b;

}
system("pause");
return 0;
}
triace_zhang 2006-06-14
  • 打赏
  • 举报
回复
int a;
int b;


while (1)
{
printf("please input two numbers!\n");
while ( !(cin >> a >> b) )
{
printf("please input two numbers again!\n");
cin.clear(); //重置cin状态为true
cin.sync(); //清空输入缓冲
}

if (a < 1 || b < 1)
continue;
else
break;

}
ftkghost 2006-06-14
  • 打赏
  • 举报
回复
UPCC(杂食动物)说的道理是对的,只是a,b不一定为0.

你可以用这个程序看看
#include <iostream>
int main(){
int a;
int b;
while (1){
std::cin >> a >> b;
std::cout <<a<<"\t\t"<<b<<std::endl;
if (a < 1 || b < 1)
continue;
else
break;
}
return 0;
}

ftkghost 2006-06-14
  • 打赏
  • 举报
回复
我给你的代码是让你看为什么出错了,出错以后输出的值是多少
Dong 2006-06-14
  • 打赏
  • 举报
回复
if (a < 1 || b < 1)
continue;
--------------------------
因为a,b都没有获取到正确的数值,都获取到空(0),所以符合这个逻辑!
加载更多回复(3)

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧