| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 471 人关注过本帖
标题:错误的输入为什么导致无限循环?????????????????
只看楼主 加入收藏
yang0401
Rank: 2
等 级:论坛游民
帖 子:84
专家分:57
注 册:2011-5-23
结帖率:69.23%
收藏
已结贴  问题点数:20 回复次数:4 
错误的输入为什么导致无限循环?????????????????
程序代码:
#include <iostream.h>
#include <stdio.h>
class rectangle
{
public:
    rectangle(int width,int height);
    ~rectangle();
    int getheight() {return itsheight;}
    int getwidth() {return itswidth;}
    int getarea() {return itsheight * itswidth;}
    int getperim() {return 2 * itsheight+2 * itswidth;}
    void setsize(int newwidth,int newheight);
private:
    int itswidth;
    int itsheight;
};
void rectangle::setsize(int newwidth,int newheight)
{
    itswidth=newwidth;
    itsheight=newheight;
}
rectangle::rectangle(int width,int height)
{
    itswidth=width;
    itsheight=height;
}
rectangle::~rectangle()
{
}
int domenu();
void dodrawrect(rectangle);
void dogetarea(rectangle);
void dogetperim(rectangle);

int main()
{
    rectangle therect(30,5);
    int choice=1;
    int quit =0;
    while(!quit)
    {
        choice=domenu();
        cout << choice << endl;
        getchar();        //如果输入的是字符和汉字等,用强制转换int输出的结果竟然是0和00等
        if(choice < 1 || choice > 5)
        {
            cout << "\nninvaid choice, please try again、\n\n";
            continue;            //这里返回while后,就一直重复执行无限循环了,怎么不调用menu函数呢?
        }
        switch(choice)
        {
        case 1:
            dodrawrect(therect);
            break;
        case 2:
            dogetarea(therect);
            break;
        case 3:
            dogetperim(therect);
            break;
        case 4:
            int newlength,newwidth;
            cout << "\nnew width:";
            cin >> newwidth;
            cout << "new heigth:";
            cin >> newlength;
            therect.setsize(newwidth,newlength);
            dodrawrect(therect);
            break;
        case 5:
            quit=1;
            cout << "\n exiting.....\n\n";
            break;
        default:
            cout << "erroe in choice! \n";
            quit =1;
            break;
        }
    }
    return 0;
}
int domenu()
{
    int choice;
    cout << "\n\n ***菜单***\n";
    cout << "(1)用#画出这个长方形 \n";
    cout << "(2)求面积\n";
    cout << "(3)求周长\n";
    cout << "(4)重新输入长度和宽度\n";
    cout << "(5)退出\n";
    cin >> choice;
    cout << choice;
    return choice;
}
void dodrawrect(rectangle therect)
{
    int height = therect.getheight();
    int width = therect.getwidth();
    for(int i=0; i < height; i++)
    {
        for(int j=0; j<width; j++)
            cout << "^";
        cout << "\n";
    }
}

void dogetarea(rectangle therect)
{
    cout << "宽度是:" << therect.getheight() << "长度是:" << therect.getwidth() << "面积是:" << therect.getarea() << endl;
}
void dogetperim(rectangle therect)
{
cout << "宽度是:" << therect.getheight() << "长度是:" << therect.getwidth() << "周长是:" << therect.getperim() << endl;
}
为什么输入的如果不是数字就会无限循环,知道死机!!!!!!!!!!!!!!!!!!!!!
2012-04-19 10:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
为什么会无限循环,看看检测循环的逻辑是否考虑到意外的输入就知道了。

授人以渔,不授人以鱼。
2012-04-19 13:51
ab1034982749
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:215
专家分:1185
注 册:2012-4-14
收藏
得分:20 
因为你定义的choice是int型的,所以在系统处理时,
由于C++执行时如果输入的数据类型与定义的不一致时,
就会直接跳过此输入行,执行下一条语句。
比如:
#include<iostream>
using namespace std;
int main(void)
{
    int a=0;
    char c;
    cin>>a;
    c=getchar();
    cout<<a<<endl<<c<<endl;
        return 0;
}
如果你输入的是个字母 比如:输入w 则会输出:
0
w;
图片附件: 游客没有浏览图片的权限,请 登录注册

就是说a的值没有被改变,而输入的数据会留在缓冲区中,当碰到与之类型相同的数据时
才把值给这个数据,所以 a 没有得到输入的char 型数据,而c与之同类型,从而得到了输入的w.
我想你应该能理解我的意思。
然后
你的程序中:
int domenu()
 { int choice;
    …………
    …………
   cin >> choice;
   cout << choice;
   return 0;
}
这个函数中由于choice 没有初始化,所以输入字符时,他不会接受字符的值,而是系统随机给他的值,
而在你的while()中由于只有一个getchar();所以输入一个字符时会循环几次,输入多个字符时就会循环多次。
(也许我说的有不对的地方,还请见谅)
2012-04-19 14:12
yang0401
Rank: 2
等 级:论坛游民
帖 子:84
专家分:57
注 册:2011-5-23
收藏
得分:0 
怎么解决这种问题呢?防止输入的类型不正确导致程序奔溃?
2012-04-23 13:49
ab1034982749
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:215
专家分:1185
注 册:2012-4-14
收藏
得分:0 
这个可以用个函数来清空输入缓冲区
fflush(stdin);
这个函数是在头文件stdlib.h中定义的。
2012-04-23 16:40
快速回复:错误的输入为什么导致无限循环?????????????????
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050561 second(s), 9 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved