2010-11-08 78 views
1

要在C中編寫程序,該程序從文件 中讀取行,該文本的名稱將在運行時爲用戶提供。 程序應該選擇文件的隨機行並打印屏幕,給用戶一個時間X來鍵入屏幕上顯示的文字。 X的時間取決於每個短語的長度,你可以認爲每個字符會給用戶1秒。 如果郵件打印正確且準時,用戶會收到祝賀。如果錯誤消息打印(並且準時),則準確地通知用戶他所犯的錯誤。最後,如果在打印消息之前時間用完,然後詢問用戶他是否想繼續,並且提供用戶對該文件的新隨機行重複上述序列的答案是肯定的,否則該程序終止。我怎樣才能從函數返回一個char值? in c unix

有人能告訴我我做錯了什麼;如果你寫你所需要的代碼,我本來就容易......

感謝聶

#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; 
} 
+2

兩件事情。 1)適當的格式(和英文評論)將幫助我們很多。 2)程序沒有做什麼?您是否收到編譯錯誤或意外的運行時行爲。 – 2010-11-08 13:40:39

回答

2

你在這裏粘貼的例子稍微難走,但它看起來像你想使一個信號處理程序返回一個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); 
} 
+1

當然最簡單,但可能不是最好的。 – 2010-11-08 13:50:31

+0

同意了,我只是注意到信號處理程序中的非異步安全調用,這也加劇了這個問題。 – Flexo 2010-11-08 13:51:50

+1

我認爲在接收到SIGALRM的情況下,scanf將返回一個錯誤並將errno設置爲EINTR。在處理程序中設置一個標誌(以區分SIGALRM與其他信號)可能更好,並在檢測到EINTR時處理庫調用。我不認爲有什麼辦法可以避免這裏的全局標誌變量。 – JeremyP 2010-11-08 15:11:31

相關問題