我想编写一个程序,用户在特定时间段内猜出一个数字。 如果他在这段时间内未能猜出正确的号码,那么超时就会发生,游戏将从第一个开始。
像
main() {
int i, timer;
while(1) {
/* How to run the timer independently and it will signal that time out !!!*/
for(i = 0; i <= 10; i++) {
printf("\n Guess the value of i : ");
scanf("%d", &j);
if(i != j) {
printf("Bad Luck wrong Guess ");
}
else
printf("Great, You guessed correctly \n");
}
}
}
在这个程序中我只是无法理解在哪里运行计时器以及如何操作? 请帮帮我。
答案 0 :(得分:1)
您的基本问题似乎是,在用户按Enter键之前,scanf()不会返回。因此,即使计时器已过期,在用户按Enter键之前也不会发生任何事情。
在标准ANSI C中,没有真正的解决方案。您需要使用特定于平台的功能。
Windows上的一种可能性是使用带有_kbhit()等功能的conio.h头文件。这允许您在尝试读取之前测试是否已按下某个键,因此如果没有按下任何键,您可以继续检查计时器。如果按下了一个键,你可以用getc()读取它,而不用担心getc()会坐在那里等待用户按一个键。继续将键读取添加到字符数组,直到您读取'\ n'字符。然后使用sscanf()将字符串转换为数字。
对于计时器本身,您只需检查time()函数的返回值。
这不是解决问题的最有效方法,因为当您编写代码时,您会发现程序循环测试_kbhit()一次又一次。
Windows上更有效的解决方案是使用重叠I / O,但这可能超出了您当前尝试的范围。
答案 1 :(得分:0)
如果超过时间限制,使用gettimeofday()
并检查每个scanf
之前的时间,您可以打破循环并显示消息。
答案 2 :(得分:0)
您可以使用信号倒计时并触发相应的操作。
signal(SIGALRM,countdown);
setitimer(ITIMER_REAL,&new_timeset,NULL);
倒计时是您要执行的功能