用C语言编写程序,从文件中读取行 text,其名称将在运行时为用户提供。 程序应选择文件的随机行并打印屏幕,为用户提供时间X来键入屏幕上显示的单词。 X的时间取决于每个短语的长度,您可以考虑每个字符将给用户1秒。 如果正确且准时地打印消息,则用户会收到祝贺。如果打印错误消息(并准时),则会准确地告知用户他所犯的错误。
最后,如果在打印消息之前时间用完,则询问用户是否要继续并提供用户对上述序列的回答是,重复该文件的新随机行,否则程序终止。 / p>
有人可以告诉我我做错了什么;如果你编写你需要的代码,我会更容易......
感谢nik
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void catch_alarm (int sig)
{
char ans[2];
printf ("Operation timed out. Exiting...\n");
printf ("thes mia akoma eukairia?[y/n]\n");
scanf ("%s", ans);
exit (0);
}
void exodos (int sig)
{
printf ("termatismos ergasias... \n");
signal (SIGQUIT, SIG_DFL);
exit (0);
}
int main (int argc, char **argv)
{
int i, j, x, count, gram[80];
i = j = count = 0;
char arxeio[25], grammi[80], buf[80][80], protash[80], ch, ans[2];
FILE *fp;
printf("dwse to onoma tou arxeiou pou thes na anoixeis: \n");
scanf("%s", arxeio);
do
{
fp = fopen( arxeio, "r");
while ( (ch = getc(fp)) != EOF )
{
buf[i][j] = ch;
if ( buf[i][j] == '\n' )
{
++i;
gram[i] = j;
j = 0;
}
++j;
}
fclose(fp);
// edw vazoume tin rand kai to apotelesma tis sto 4 parakatw
x = rand() % i;
j = 0;
while (j<=gram[x+1])
{
printf("%c", buf[x][j]);
j++;
}
/* elenxos entos xronou an oxi TIME OUT... */
signal(SIGALRM, catch_alarm);
fflush(stdout);
alarm(gram[x+1]);
scanf("%s",protash);
if (ans[0] == 'n')
signal(SIGQUIT, exodos);
/* elenxos or8hs eisagwghs dedomenwn*/
j = 0;
while ( j<=(gram[x+1]-2) )
{
if ( buf[x][j+1] != protash[j] )
printf("anti gia %c egrapses %c\n", buf[x][j+1], protash[j]);
else
printf("swsto\n");
++j;
}
/* deuterh eukairia... */
}
while ( ans[0] == 'y' );
return 0;
}
答案 0 :(得分:2)
您在此处粘贴的示例稍微难以理解,但看起来您正在尝试让信号处理程序返回一个char。这是不可能的,因为信号处理程序必须是无效的(尽管函数通常可以返回一个char)。
最简单的解决方法是改为全局(静态?)变量。
另请注意,printf和scanf不是async-safe。解决这个问题的方法是在某个地方设置一个“标志”,然后注意这已经设置好了。
修改我认为这是您在此处尝试实现的简化示例:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <signal.h>
#include <errno.h>
static int timeout = 0;
static void catch_alarm(int sig) {
if (SIGALRM != sig || 0 != timeout)
abort();
timeout = 1;
}
int main() {
char buf[80];
signal(SIGALRM, catch_alarm); //TODO: check return!
printf("Type some stuf:\n");
fflush(NULL);
alarm(5);
int read = -1;
while (read < 0 && !timeout) {
read = scanf("%80s", buf);
}
if (timeout) {
printf("Time out, do something else\n");
}
exit(0);
}