首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于防“死锁”,换个角度再讨论解决方法

2012-02-20 
关于防“死锁”,换个角度再讨论主  题:菜鸟恳请能手解决问题虽小,但常常困扰作  者:LDW1688()Blog等  级:信

关于防“死锁”,换个角度再讨论
主  题:     菜鸟恳请能手解决   问题虽小,但常常困扰    
作  者:     LDW1688   ()                 Blog    
等  级:        
信   誉   值:     100    
所属社区:     C/C++   C++   语言    
问题点数:     20    
回复次数:     3    
发表时间:     2007-1-30   12:03:35    
     
 
     

比如下面简单的“猜岁”范例程序,按程序本应输入浮点数或整数,这样就能正常运行下去。但如果不小心(或特意)输入了含字母的字符串(如输入9k),就进入死循环,须关闭程序。请高手修改下面程序,达到输入字母字符串时,无须关闭程序,还能继续输入且正常运行下去:


    #include <iostream.h>
    #include <stdio.h>
void   main()
        {
        const   float   sui=25.5;
        float   cai;
        in:   cout < < "请从键盘输入你猜的岁数: ";   cin> > cai;
                while(cai <0)
                {
        cout < < "时光能倒流吗?   请重新输入你猜的岁数: ";   cin> > cai;
                }
                if(cai==sui)
        cout < < "     对!岁数是 " < <sui < <endl
                < <endl;
                if(cai> sui)
                {
        cout < < "过大了。 " < <endl
                < <endl;
        goto   in;
                }
                if(cai <sui&&cai> =0)
                {
        cout < < "小了。 " < <endl
                < <endl;
        goto   in;
                }
        }


   
    jixingzhong(瞌睡虫·星辰)   (   )   信誉:102         Blog     2007-1-30   12:05:05     得分:   5    
 
 
     
对输入进行校验就可以了   ~

   
 
Top    
  jixingzhong(瞌睡虫·星辰)   (   )   信誉:102         Blog     2007-1-30   12:16:54     得分:   15    
 
 
     
供参考一个:

#include   <string>
#include   <sstream>
#include   <iostream>
#include   <cstdlib>
#include   <cstdio>

using   namespace   std;

int   main   ()
{
        const   float   sui=25.5;
        float   cai;
        cout < < "请从键盘输入你猜的岁数: ";  
   
        in:   string   tmp;


                getline(cin,   tmp);
                while(tmp.find_first_not_of( ".0123456789 ")   !=   string::npos)
                {
                        cout < < "你输入的数据有误,请确认,并重新输入! " < <endl;
                        cout < < "请从键盘输入你猜的岁数: ";  
                        getline(cin,   tmp);
                }        
                istringstream     str(tmp);
                str> > cai;
       
                while(cai <0)
                {
                        cout < < "时光能倒流吗?   请重新输入你猜的岁数: ";  
                        goto   in;
                }
                if(cai==sui)
                        cout < < "     对!岁数是 " < <cai < <endl < <endl;
                if(cai> sui)
                {
                        cout < < "过大了。 " < <endl < <endl;
                        goto   in;
                }
                if(cai <sui&&cai> =0)
                {
                        cout < < "小了。 " < <endl < <endl;
                        goto   in;
                }
        system( "PAUSE ");
        return   0;
}

   
 
Top    
  LDW1688()   (   )   信誉:100         Blog     2007-1-30   18:30:34     得分:   0    
 
 
     
以上回复解决了我希望解决的死锁问题,领教受益,诚表谢意。还希望再指点修改,因为以上修改产生了新的不如意:第一次输入数据后,要按两次回车键才输出结果;之后每次输入数据,第一次回车后输出与实际相反的提示。

   
 
Top  
##########################################################################

昨晚经过网友文轩的修改后又大体解决了以上的不如意,但还有些不尽善。由于这个不是实用程序,不打算在以上方法再花时间修改了。而换个角度探讨,以求抛砖引玉。我设想如果不用以上输入校验的方法来防死锁,是否更简单可行?用输入校验的方法有太多的副作用要修改。我企图用的新方法是:“容错默认法”。我认为系统先把输入的字符串自动转化为浮点数或整数(按变量说明),   把字符串开头的全部数字为默认输入,后接的字母舍弃,如9a=9,   32km=32   ;把开头为字母的串(如f3)当负数。但输入这些回车后为什么会进入死锁呢?我认为系统不释放这些含字母串的输入缓冲区,就不再等待输入而至于死锁。所以我试图用函数setbuf(NULL,NULL)来人工释放它,编译执行,果然不死循环了,但再输入不了。我认为再要用setbuf(stdin,)来重置缓冲区可解决,但不知第二个参数怎设。我第一次修改后未成功的代码如下:



    #include <iostream.h>
    #include <stdio.h>
void   main()
        {
        const   float   sui=25.5;
        float   cai;
        in:   cout < < "请从键盘输入你猜的岁数: ";   cin> > cai;
                while(cai <0)
                {
        cout < < "时光能倒流吗?   请重新输入你猜的岁数: ";
        setbuf(NULL,NULL);//释放输入缓冲区
        setbuf(stdin,       );//企图重置缓冲区,但不知第二个参数怎设
        cin> > cai;
                }
                if(cai==sui)
        cout < < "     对!岁数是 " < <sui < <endl
                < <endl;
                if(cai> sui)
                {
        cout < < "过大了。 " < <endl
                < <endl;
        setbuf(NULL,NULL);//释放输入缓冲区
        setbuf(stdin,       );//企图重置缓冲区,但不知第二个参数怎设
        goto   in;
                }
                if(cai <sui&&cai> =0)
                {
        cout < < "小了。 " < <endl
                < <endl;
        setbuf(NULL,NULL);//释放输入缓冲区
        setbuf(stdin,       );//企图重置缓冲区,但不知第二个参数怎设
        goto   in;
                }
        }

不知各位能手好手高手老手认为如何?请赐教。

[解决办法]
istringstream str(tmp);
str> > cai;
用他就能实现你要的功能
[解决办法]
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>

void main()
{
const float sui=25.5;
char cai[20] = {0};
cout < < "请从键盘输入你猜的岁数: ";
while(cin> > cai)
{
if(atof(cai) <0)
cout < < "时光能倒流吗? 请重新输入你猜的岁数: ";
else if(atof(cai)==0)
cout < < " 岁数不能是 " < <cai < <endl;
else if(atof(cai)> sui)
cout < < "过大了。 " < <endl;
else if(atof(cai) <sui&&atof(cai)> =0)
cout < < "小了。 " < <endl;
else
{
cout < < " 对!岁数是 " < <sui < <endl;
break;
}
cout < < "请重新从键盘输入你猜的岁数: ";
}
}

热点排行