Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从函数返回char值?在c-unix中_C_Unix - Fatal编程技术网

如何从函数返回char值?在c-unix中

如何从函数返回char值?在c-unix中,c,unix,C,Unix,用C语言编写从文件中读取行的程序 文本,其名称将在运行时提供给用户。 程序应该随机选择一行文件并打印屏幕,给用户一个时间X来键入屏幕上看到的单词。 X的时间取决于每个短语的长度,你可以考虑每个字符会给用户1秒。 如果消息打印正确且及时,用户将收到祝贺。如果打印了错误消息(并且及时),则会准确地通知用户他所犯的错误 最后,如果打印消息前时间已过,则询问用户是否要继续,如果用户回答“是”,则对文件的新随机行重复上述序列,否则程序终止 有人能告诉我我做错了什么吗;如果你写下你需要的代码,我会更容易 谢

用C语言编写从文件中读取行的程序 文本,其名称将在运行时提供给用户。 程序应该随机选择一行文件并打印屏幕,给用户一个时间X来键入屏幕上看到的单词。 X的时间取决于每个短语的长度,你可以考虑每个字符会给用户1秒。 如果消息打印正确且及时,用户将收到祝贺。如果打印了错误消息(并且及时),则会准确地通知用户他所犯的错误

最后,如果打印消息前时间已过,则询问用户是否要继续,如果用户回答“是”,则对文件的新随机行重复上述序列,否则程序终止

有人能告诉我我做错了什么吗;如果你写下你需要的代码,我会更容易

谢谢,尼克

#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;
}
#包括
#包括
#包括
#包括
无效捕捉报警(int sig)
{
char-ans[2];
printf(“操作超时。正在退出…\n”);
printf(“thes mia akoma eukairia?[y/n]\n”);
scanf(“%s”,ans);
出口(0);
}
无效exodos(内部信号)
{
printf(“termatismos ergasias…\n”);
信号(SIGQUIT、SIG_DFL);
出口(0);
}
int main(int argc,字符**argv)
{
整数i,j,x,计数,克[80];
i=j=count=0;
char arxeio[25],grammi[80],buf[80][80],protash[80],ch,ans[2];
文件*fp;
printf(“dwse至onoma tou arxeiou pou thes na anoixeis:\n”);
scanf(“%s”,arxeio);
做
{ 
fp=fopen(arxeio,“r”);
而((ch=getc(fp))!=EOF)
{ 
buf[i][j]=ch;
如果(buf[i][j]='\n')
{
++一,;
g[i]=j;
j=0;
}
++j;
}
fclose(fp);
//edw vazoume tin rand kai至apotelesma tis sto 4 parakatw
x=rand()%i;
j=0;

虽然(j您粘贴在这里的示例有点难以理解,但看起来您正在尝试使信号处理程序返回字符。这是不可能的,因为信号处理程序必须是空的(尽管函数通常可以返回字符)

最简单的解决方法是使用全局(静态?)变量

还要注意的是printf和scanf不是。解决方法是在某个地方设置一个“标志”,然后注意稍后已经设置了这个标志

编辑我认为这是一个简单的示例,说明了您在这里要实现的目标:

#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);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
静态int超时=0;
静态无效捕捉报警(int sig){
if(SIGALRM!=sig | | 0!=超时)
中止();
超时=1;
}
int main(){
char-buf[80];
信号(信号,捕捉报警);//TODO:检查返回!
printf(“键入一些stuf:\n”);
fflush(空);
警报(5);
int read=-1;
while(读取<0&!超时){
read=scanf(“%80s”,buf);
}
如果(超时){
printf(“超时,执行其他操作\n”);
}
出口(0);
}

两件事。1)正确的格式(和英文注释)这对我们会有很大帮助。2)程序失败的原因是什么?您是否遇到编译错误或意外的运行时行为。当然最简单,但可能不是最好的。我同意,而且我刚刚注意到信号处理程序中存在非异步安全调用,这也加剧了问题。我认为scanf将返回错误并将errno设置为EINTR在接收到SIGALRM的情况下。最好在处理程序中设置一个标志(以区分SIGALRM与其他信号),并在检测到的库调用的EINTR上处理它。我认为这里没有任何方法可以避免全局标志变量。@JeremyP:我认为在使用signal()时返回EINTR是正确的例如,我认为sigaction()+SA_RESTART会破坏这种行为。