
一个c/c++小难题!!!!
如何实现下面这个程序:程序开始运行就等待键盘输入,若在10秒内有键盘输入就立即打印输入的内容并结束程序;否则10秒后打印"timesup"并自动结束程序...
如何实现下面这个程序:
程序开始运行就等待键盘输入,
若在10秒内有键盘输入就立即打印输入的内容并结束程序;
否则10秒后打印"times up"并自动结束程序 展开
程序开始运行就等待键盘输入,
若在10秒内有键盘输入就立即打印输入的内容并结束程序;
否则10秒后打印"times up"并自动结束程序 展开
4个回答
展开全部
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个程序来解决,在同步的情况下,阻塞了便无法动弹。界面的好解决也是因为它可以同一时间捕获不同的消息。这一点控制台无法做到。
楼主能想到这样的问题是蛮不错的,不过想太多了就是钻牛角尖了,没多大意义。我花了一个下午,也比较喜欢钻牛角尖 ^^
我在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个程序来解决,在同步的情况下,阻塞了便无法动弹。界面的好解决也是因为它可以同一时间捕获不同的消息。这一点控制台无法做到。
楼主能想到这样的问题是蛮不错的,不过想太多了就是钻牛角尖了,没多大意义。我花了一个下午,也比较喜欢钻牛角尖 ^^
展开全部
关注
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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;
}
#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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询