读书人

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

发布时间: 2012-02-20 21:18:24 作者: rapoo

关于防“死锁”,换个角度再讨论
主  题: 菜鸟恳请能手解决 问题虽小,但常常困扰
作  者: 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 < < "请重新从键盘输入你猜的岁数: ";
}
}

读书人网 >C++

热点推荐