#include <iostream.h>
#include <stdlib.h>void main()
{
int choice;
do
{
cout << "重新输入:\n"
<< " 1.  停止运行程序\n"
<< " 2.  重新输入\n"
<< " 3.  以默认参数运行" <<endl;
cin >> choice;
switch(choice)
{
case 1: exit(1);
case 2: break;
case 3: {
     choice = 0;
break;
}
default : { cout << "wrong key , input again:\n";}
}
}while(choice);
cout <<"==EnD==="<<endl;
}当我输入整数的时候,运行正常,当我输入一个字母的时候,程序结束而不是
让我重新输入,我以为那时候choice的值不能让while为真,于是我把default
那句改成default : { cout << "wrong key , input again:\n"; choice = 4;}
结果,当我输入一字母,就出来一个死循环,为什么? 应该怎么改才能不管
输入什么,只要不是123,程序就让我重新输入?
还有,为什么会出现死循环的呢? 在cin >> choice;的时候为什么会不停下来?

解决方案 »

  1.   

    挺怪异的,
    我输入3333333333333333333333
    wrong key , input again
    重新输入:
     1.  停止运行程序
     2.  重新输入
     3.  以默认参数运行
    wrong key , input again
    重新输入:
     1.  停止运行程序
     2.  重新输入
     3.  以默认参数运行
    ===
    一下就出来两个,然后再等待我输入。我输入
    333333333333333333333333333m
    wrong key , input again:
    重新输入:
     1.  停止运行程序
     2.  重新输入
     3.  以默认参数运行
    wrong key , input again:
    重新输入:
     1.  停止运行程序
     2.  重新输入
     3.  以默认参数运行
    wrong key , input again:
    ==EnD===
    Press any key to continue
    出来两个提示,并结束了程序,
    有哪位能帮我解释一下么?
      

  2.   

    default : { cout << "wrong key , input again:\n";
    break;}
      

  3.   

    这个问题的直接原因是你的choice 是int型的,对于cin它会自动判断你的输入是否是整数,则返回空值,如果你希望能够同时处理输入的字符,可以将choice改为char型。同时修改case 语句的判断条件为判断 字符 。下面是我改过的程序可以正常的运行。
    #include <iostream.h>
    #include <stdlib.h>void main()
    {
    char choice;
    do
    {
    cout << "重新输入:\n"
    << " 1.  停止运行程序\n"
    << " 2.  重新输入\n"
    << " 3.  以默认参数运行" <<endl;
    cin >> choice;
    switch(choice)
    {
    case '1': exit(1);
    case '2': break;
    case '3': {
         choice = 0;
    break;
    }
    default : { cout << "wrong key , input again:\n";}
    }
    }while(choice);
    cout <<"==EnD==="<<endl;
    }
      

  4.   

    把choice改成char型,试试看,记得在case的地方变为‘1’,‘2’,‘3’
      

  5.   


    #include <iostream.h>
    #include <stdlib.h>void main()
    {
    char choice;
    do
    {
    cout << "重新输入:\n"
    << " 1.  停止运行程序\n"
    << " 2.  重新输入\n"
    << " 3.  以默认参数运行" <<endl;
    cin >> choice;
    switch(choice)
    {
    case '1': exit(1);
    case '2': break;
    case '3': {
         choice = 0;
    break;
    }
    default : { cout << "wrong key , input again:\n";}
    }
    }while(choice);
    cout <<"==EnD==="<<endl;
    }
      

  6.   

    谢谢各位,
    为什么改成default : { cout << "wrong key , input again:\n"; choice = 4;}不行呢?
    那如果我输入一个字母,执行完default那句后,choice的值是什么?
    还有,有cin >> choice;语句的存在,为什么会跳过这一句?
      

  7.   

    switch(choice)
    假若输入"A"
    choice = 'A' 
    (0X41)所以错了。
      

  8.   

    因为输入字母时choice=0,而当choice 为0时被你改成了4所以当然会进入死循环。对于你说的跳过cin>>choice语句的问题,是由于在读入一个字符时只占用一个字节,它找不下一个字节(而int型至少占用两个字节)这样打乱它的读入操作,造成它不能正确的解释结束符,就会认为他的缓冲区里还有整数可以读,这也就是上面为什么在输入了333333之后会跳过输入部分的原因。
      

  9.   

    恩,老大,我知道把choice改成char型的可以使程序正确运行了。如果我定义choice类型为int,而又给他输入了一个字母,会导致错误,我现在想知道这个错误的结果是不可预料的,还是可以预料的?如果是可预料的,那么哪位朋友能把程序运行的过程帮我分析一下,比如
    运行到哪里之后,出现什么结果,某个参数的值为多少,跳转到哪里,执行
    哪个语句,然后然后然后。这样我就可以知道为什么有时候输入某个值他会执行两次提示后再停在那里
    让我继续输入,为什么有时候输入某个值他会执行两次提示后直接跳到结束
    的部分,为什么有时候输入某个值他就一直不停地出现提示而跳过cin语句。
      

  10.   

    void main()
    {
    char choice;
    do
    {
    cout << "重新输入:\n"
    << " 1.  停止运行程序\n"
    << " 2.  重新输入\n"
    << " 3.  以默认参数运行" <<endl;
    cin >> choice;
                      getchar();  //接收回车键
    switch(choice)
    {
    case '1': exit(1);
    case '2': break;
    case '3': {
         choice = 0;
    break;
    }
    default : { cout << "wrong key , input again:\n";}
    }
    }while(choice);
    cout <<"==EnD==="<<endl;
    }
      

  11.   

    ....各位老大,我现在想知道的是,如果choice为int,而我又输入一个字符,
    之后,程序是怎么一步一步错下去的,而输入一个字符和输入一个超过int
    能接受的最大值的整数结果又完全是不一样的,输入的整数后,好象程序是
    把那个数截断了来处理的,所以大小不一样,出来的重复提示也不一样。望有热情的朋友能帮我解释一下。
    嫌分不够我可以另给,不过我来csdn没几天,也没多少可用分
      

  12.   

    你可以研究一下3333333333333333333333在一个4byte的int变量中应该表示为什么?提示一下,它已经大大溢出了.所以实际在内存中的choice的值是不可预知的.但可以肯定的是,编译器把它当做两个输入读进来的,所以一次输入,cin读了两次,就是你说的cin没有停的原因.不知说的对不对,请大家更正.