一个c/c++小难题!!!!

如何实现下面这个程序:程序开始运行就等待键盘输入,若在10秒内有键盘输入就立即打印输入的内容并结束程序;否则10秒后打印"timesup"并自动结束程序... 如何实现下面这个程序:

程序开始运行就等待键盘输入,
若在10秒内有键盘输入就立即打印输入的内容并结束程序;
否则10秒后打印"times up"并自动结束程序
展开
 我来答
百度网友d3e418b2c
2007-10-19 · TA获得超过2195个赞
知道大有可为答主
回答量:1361
采纳率:0%
帮助的人:1728万
展开全部
scanf是阻塞类函数,一旦运行就会等待在那,执行不了其他语句,所以如果想用scanf实现这个效果是不大可能。除非用linux系统里的fork()复制一个一模一样的进程才行。

我在linux上做的,以一个文件为标志,程序开始便fork为2个进程,父进程scanf等待输入,一旦输入后改变文件标志,子进程则不断循环判断时间是否超时,未超时则去看文件标志,若标志被改变,表示用户已scanf输入,若未改变,继续循环直至超时。运行达到了效果。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int iPid;
int num;
char ch;
time_t t;
FILE *fp;

t = time(NULL);
fp = fopen("biaozhi","w");
fputc('n', fp);
fclose(fp);
if((iPid = fork())<0)
{
printf("fork error\n");
return -1;
}
else if(iPid == 0)
{
while(1)
{
if(time(NULL)-t>10)
{
printf("超时退出!\n");
//system("kill -9 `/sbin/pidof 2`");
exit(0);
}
else
{
if((fp = fopen("biaozhi","r"))!=NULL)
{
ch = fgetc(fp);
fclose(fp);
if(ch=='y')
{
printf("用户已输入!子进程结束\n");
exit(0);
}
}

sleep(1);
}
}
}
else
{
scanf("%d",&num);
printf("num=%d\n",num);
fp = fopen("biaozhi","w");
fputc('y', fp);
fclose(fp);
}
return 0;
}

windows中如果用界面程序是很简单的,用一个timer控件就搞定了。有个ontime事件。
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
//Timer1->Interval = 10000;
MessageBox(this->Handle,"time is up","sorry",MB_OK);
exit(0);
}
只要在触发的事件那里写一行Timer1->Enabled = false;就可以了。
控制台程序就比较麻烦了,我试了fork(),编译过不去,没这个函数。

总的来说,这是一个异步的过程,得用2个程序来解决,在同步的情况下,阻塞了便无法动弹。界面的好解决也是因为它可以同一时间捕获不同的消息。这一点控制台无法做到。
楼主能想到这样的问题是蛮不错的,不过想太多了就是钻牛角尖了,没多大意义。我花了一个下午,也比较喜欢钻牛角尖 ^^
少问少知
2007-10-18
知道答主
回答量:18
采纳率:0%
帮助的人:0
展开全部
用计时器类不就可以了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友dab4b28f1
2007-10-18 · TA获得超过291个赞
知道答主
回答量:308
采纳率:0%
帮助的人:0
展开全部
关注
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友0f8f584e8c
2007-10-19
知道答主
回答量:8
采纳率:0%
帮助的人:0
展开全部
#include<windows.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>
int press()
{ int i;
for(i=0;i<256;i++)
if(GetAsyncKeyState(i)<0&&i>2){return 1;}
return 0;
}
int main()
{ char pressdown=0,c;
long timepass=1,start,finish;
Sleep(100);
start=clock();
while(timepass<10000)
{ printf("\rtime-left %2ds. input a key:",(10000-timepass)/1000+1);
if(press()){pressdown=1;break;}
Sleep(100);
timepass=clock()-start;
}
if(pressdown)
{c=getche();printf("\n you pressed %c \n ",c);}
else printf("\rtime-left 0s. input a key: \n times up!");
c=getche();
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式