Как я могу вернуть значение char из функции?в C Unix - PullRequest
1 голос
/ 08 ноября 2010

Для написания программ на C, который читает строки из текста файла, чье имя будет давать пользователь во время выполнения.Программа должна выбрать случайную строку файла и распечатать экран, предоставляя пользователю время X для ввода слов, отображаемых на экране.Время X зависит от длины каждой фразы, и вы можете считать, что каждый символ даст пользователю 1 секунду.Если сообщение напечатано правильно и вовремя, пользователь получает поздравления.Если сообщение об ошибке напечатано (и вовремя), то пользователь точно информируется об ошибках, которые он совершил.

Наконец, если время заканчивается до того, как распечатать сообщение, он спрашивает пользователя, хочет ли он продолжить.и при условии, что пользователь отвечает «да» на вышеупомянутую последовательность, повторяется для новой случайной строки файла, в противном случае программа завершается.

Может кто-нибудь сказать мне, что я сделал неправильно;Мне было бы проще, если бы вы написали нужный код ...

спасибо 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;
}

1 Ответ

2 голосов
/ 08 ноября 2010

Пример, который вы вставили сюда, немного сложен, но похоже, что вы пытаетесь заставить обработчик сигнала вернуть символ. Это невозможно, потому что обработчик сигнала должен быть пустым (хотя в общем случае функция может возвращать символ).

Самым простым способом решения этой проблемы была бы глобальная (статическая?) Переменная.

Также обратите внимание, что 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...