注册 登录
编程论坛 C++教室

明白switch的来一下,看你会解决吗?

发布于 2010-05-06 18:44, 2038 次点击

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    char ch;
    while(1)
    {
        cout<<"1 增加姓名"<<endl;
        cout<<"2 删除姓名"<<endl;
        cout<<"0 退出"<<endl;
        cout<<"请输入你的选项:"<<endl;
        cin>>ch;
        switch(ch)
        {
        case '1':cout<<"增加成功"<<endl;break;
        case '2':cout<<"删除成功"<<endl;break;
        case '0':return 0;
        default:continue;
        }
    }
    return 0;
}
请问,输入一个字母为什么会产生无限循环?
27 回复
#2
2010-05-06 18:46

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    int ch;
    while(1)
    {
        cout<<"1 增加姓名"<<endl;
        cout<<"2 删除姓名"<<endl;
        cout<<"0 退出"<<endl;
        cout<<"请输入你的选项:"<<endl;
        cin>>ch;
        switch(ch)
        {
        case 1:cout<<"增加成功"<<endl;break;
        case 2:cout<<"删除成功"<<endl;break;
        case 0:return 0;
        default:continue;
        }
    }
    return 0;
}
不好意思,这个程序才对。上面的不对。请问,输入一个字母为什么会产生无限循环?
#3
2010-05-06 19:05
switch(ch){}中间的语句有错误,只有你输入“0”时才会给while-do循环返回值“0”,其他的则虽跳出switch,而返回的值是“1”,让while循环陷入了死循环
#4
2010-05-06 19:09
回复 3楼 flyor
我不太理解你的意思,可以说清楚一定吗?  我现在要上课了,晚上回来继续。
#5
guowei37582010-05-06 19:44
如果输入1或2,程序读到break后只跳出swith,但还在while循环中,whilehou括号中仍为1;继续循环
只有输入0的时候,才会给while后的括号中返回0,跳出循环
#6
xueyuhanhai2010-05-06 20:27
// sdf.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
#include<iomanip>
using namespace std;

int main(int argc, char* argv[])
{
        int ch;
        int flag;// 作为程序是否继续的标志;
        do
        {
            cout<<"1 增加姓名"<<endl;
            cout<<"2 删除姓名"<<endl;
            cout<<"0 退出"<<endl;
            cout<<"请输入你的选项:"<<endl;
            cin>>ch;
            switch(ch)
            {
                case 1:cout<<"增加成功"<<endl;break;
                case 2:cout<<"删除成功"<<endl;break;
                case 0:return 0;//跳出整个while循环,转到Hello World处;
                default:continue;//跳出本次的switch循环;
            }
            printf("是否继续:1.是    0.否");
            printf("\n");
            scanf("%d",&flag);//用以判断是否继续
        }while(flag);
        printf("Hello World!\n");
        return 0;
}

不知楼主是否满意。呵呵。。。
#7
最近不在2010-05-06 21:08
这就是int型,接受字符出现的bug.....
#8
2010-05-06 21:47
while(1)这个语句恒成立!当然会无限循环了!
#9
2010-05-06 22:27
可能大家不理解我的意思,7楼的哥们明白了,你们好像没有明白我的意思,7楼的哥们,这是个bug没有办法解决吗?
#10
2010-05-06 22:29
回复 6楼 xueyuhanhai
如果输入字符,你的程序也是无限循环,死程序。
#11
Muyoo2010-05-06 22:59
只能输入int,不能输字符 你在用户输入以后检测输入就好
#12
2010-05-06 23:03
回复 11楼 Muyoo
为什么不可以输入字母?
#13
2010-05-06 23:09
我想知道输入一个字符,产生死循环的原因。为什么会出现这种情况?希望高手解答。谢了。
#14
wsf19911232010-05-07 00:42
只挑出了switch没跳出while
#15
2010-05-07 02:53
?
#16
ybjx19872010-05-07 09:49
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    char ch;'把ch改为字符类型就可以了
    while(1)
    {
        cout<<"1 增加姓名"<<endl;
        cout<<"2 删除姓名"<<endl;
        cout<<"0 退出"<<endl;
        cout<<"请输入你的选项:"<<endl;
        cin>>ch;
            switch(ch)
            {
                case '1':cout<<"增加成功"<<endl;break;
                case '2':cout<<"删除成功"<<endl;break;
                case '0':return 0;
                default:continue;
            }
    }
    return 0;
}
#17
wv1362010-05-07 11:42
bug也是自己写出来的!!更正就好!别人给的是解决bug的方法,而不是指出问题的所在!话说回来,这不算bug吧,程序本身不存在跳出循环的语句!!
#18
2010-05-07 12:46
回复 16楼 ybjx1987
恩,我知道改成char就可以了,但是我就是不知道换成int后为什么会产生这个结果。我测试一下发现输入的字符变成了一个很大的负数。
#19
2010-05-07 12:47
回复 17楼 wv136
case '0':return 0;  这句话就是跳出循环的。
#20
wv1362010-05-08 06:08
回复 19楼 刚开始吧
这个不对,应该使用 break;跳出循环,return 0;是返回....
#21
wv1362010-05-08 06:20
回复 2楼 刚开始吧
我帮你改下....完全可以运行,当输入为字母时,退出程序!!!


#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    int ch; //这里声明了一个变量!!是char型的就把下面绿色部分改成 while(ch =='1')
    cin >> ch; //在这里应该有 cin >> ch;  接受用户的输入..
    while(1)  //这里的问题就大咯 ,,while(1)貌似就不会有第二个选择!!这样写 while(ch ==1)
    {  //请注意这个花括号!
        cout<<"1 增加姓名"<<endl;
        cout<<"2 删除姓名"<<endl;
        cout<<"0 退出"<<endl;
        cout<<"请输入你的选项:"<<endl;
      //因为不明白你需要什么样的结果,如果没有猜错,下面就应该跳出while循环,当然得有个花括号吧!!
      break;
     } //如果没有这个花括号,那么下面的switch语句还是在while语句中循环的一部份。

        cin>>ch;  //再次等待输入...
        switch(ch)   //判断输入的字符....
        {
        case 1:cout<<"增加成功"<<endl;break;
        case 2:cout<<"删除成功"<<endl;break;
        case 0:return 0;  //这里应该用 break;跳出,return 0;只是返回,用在函数最后的。
       default:continue;  //这是捕获其它字符的,遇编译时出错,请改为 default:break;!!
        }
  //  } //这个花括号,多余的。
    return 0;  //函数执行完成,返回..
}

//复制代码,修改一下需要更改的错误,按ctrl +F5 执行...

[ 本帖最后由 wv136 于 2010-5-8 06:58 编辑 ]
#22
apull2010-05-09 18:24
回复 楼主 刚开始吧
switch(ch)
        {
        case '1':cout<<"增加成功"<<endl;break;
        case '2':cout<<"删除成功"<<endl;break;
        case '0':return 0;
        default:continue;
        }
这里的break的意思退出switch,然后继续执行switch后面的语句。

程序执行后除了按0外,会一直循环下去。

vc,gcc运行正常。
#23
2010-05-09 19:38
回复 21楼 wv136
我的意思是要循环输出:
        cout<<"1 增加姓名"<<endl;
        cout<<"2 删除姓名"<<endl;
        cout<<"0 退出"<<endl;
        cout<<"请输入你的选项:"<<endl;
然后根据你的输入在进行操作。
你给我改的程序1:程序执行并不是直接输出这三行,而是接受你的输入。
              2:等输入一个字符,然后就不可以接受你写的第二个输入。
              3:我的目的只有输入0结束,其余的都要循环测试。也就是循环输出上面那四行语句。
#24
2010-05-09 19:40
回复 22楼 apull
对,我要的就是这种效果,但是在输入字符的时候是一个死循环。这点我就不明白。
#25
wv1362010-05-16 00:11
一直没有时间上来,原来还没有解决呀!!如今再发::
#include<iostream.h> //如果编译错误更改一下
//#include<iomanip>
//using namespace std;  //还有这个取消注释。
int main()
{ int ch=0;                 //这里使用的是 int 类型的变量;
          do
        {
        cout<<"1 增加姓名"<<endl;
        cout<<"2 删除姓名"<<endl;
        cout<<"0 退出"<<endl;
        cout<<"请输入你的选项:"<<endl;
        cin>>ch;
        }while (ch>=3||ch<0);
    goto end;

end:      
switch(ch)
{
case 1:cout<<"增加成功"<<endl;break;
case 2:cout<<"删除成功"<<endl;break;
case 0:break;
    //return 0;
    //default:continue;
}
    return 0;
}


/////最后,当你输入非0、1、2数字时,do循环,输入字符就会退出。
/////改为char类型可以完全达到你想要的效果哦!
////不知你满意不??????????????
#26
Muyoo2010-05-19 00:42
回复 12楼 刚开始吧
switch语句在编译时case的选择全是整型常表达式的话,似乎default也将认为是判断整型。
所以当你在运行程序输入字符以后,是先将这个字符存在缓冲区里进行判断:a不是整型-->(再判断)-->a还不是整型-->(再判断一次)-->a怎么又不是整型-->(再来)-->a仍然不是整型-->……
就死循环了……

避免这个死循环最好就是在用户输入值后在执行switch前加段代码判断;或者清空缓冲区;
另外不知楼主是不是用的VC6.0?

[ 本帖最后由 Muyoo 于 2010-5-19 08:42 编辑 ]
#27
fanfan3202010-05-19 14:50
budong
#28
hahayezhe2010-05-19 15:20
int i;
cin>>i;

当你输入字符时 cin就去缓冲区 一看是字符 类型不匹配 怎么办 只能空跑一趟
这时i没有被赋值
如果你这么写
int i=10;
cin>>i;键入 a
cout<<i; 输出10;说明没有给i赋任何值
这时如果外面套个循环while(1)的话
为真 那么当程序到cin<<i;时 缓冲区有东西 所以他不会让你再继续输入,cin会将你先前输入的
字母a拿去判断 发现类型不匹配 继续循环
怎么解决呢
fflush(stdin) 只要将那个该死在缓冲流里的字母清理掉 就行了
比如while(1)
{fflush(stdin);
cin>>i;}
当然你用getchar()也可以
这样就不形成死循环了
而且你还可以给i赋个初值 如果其值没有改变 那说明输入非法
当然也可以用字符接收后面的'\0'来判断输入正确与否
比如c=getchar() 如输入正确 c='\0' 如错误 c=输入的字母 这种现象貌似只限于scanf
1