gpt4 book ai didi

无法输入 if 条件和函数返回段错误错误

转载 作者:行者123 更新时间:2023-11-30 17:22:38 26 4
gpt4 key购买 nike

该程序应该通过管道在客户端和服务器之间进行通信。通信已经可以正常工作,但我仍然有两个问题:

  1. 当用户输入 compilar -l 时,应该输入 if(i==1 && strcmp(c,"l")==0) code> 但事实并非如此...如果用户输入 compilar -c 0,它会按预期进入第二个 if 条件。我不知道为什么第一个 if 不起作用...

  2. 如果我输入 listartarefas() (不久前,第一个 if 有效,因此我可以测试它),它会给我一个段错误错误。

有人可以帮我吗?

Listartarefas() 函数:

#define TAM_MAX 99

int num = 0;

void listartarefas(Task **tf)
{
int i;
for(i=0;i<=(TAM_MAX-1);i++)
{
if(tf[i]->tipo == 1)
{
printf("Agendada:\n");
printf("%d\n",tf[i]->identf);
printf("%s\n",(tf[i]->path));
printf("%d-%d-%d\n",(tf[i]->ano),(tf[i]->mes),(tf[i]->dia));
printf("%d:%d:%d\n",(tf[i]->hora),(tf[i]->min),(tf[i]->seg));
}
else
{
printf("Executada:\n");
printf("%d\n",tf[i]->identf);
printf("%s\n",(tf[i]->path));
printf("%d-%d-%d\n",(tf[i]->ano),(tf[i]->mes),(tf[i]->dia));
printf("%d:%d:%d\n",(tf[i]->hora),(tf[i]->min),(tf[i]->seg));
}
}
}

主函数:

int main()
{
int fd1, fd2;
int n=0;
int v =1;
int i=0;
char *t;
char c[2]="";
Task recebido;
char buffer[70]=""; //Buffer que guarda o que o cliente envia
char buffer2[1]=""; //Buffer que guarda o que o servidor envia

Task tf[TAM_MAX]; //Array de tarefas: onde estão guardadas todas as tarefas introduzidas pelo cliente

if (access("fifo", F_OK) == -1) //Testa se o ficheiro existe
{
if (mkfifo("fifo", 0666) == -1) { //Criar fifo para ler o buffer recebido pelo cliente
perror("fifo ler");
return EXIT_FAILURE;
}
}

if (access("fifo2", F_OK) == -1)
{
if (mkfifo("fifo2", 0666) == -1) //Criar fifo para escrever no buffer2 e enviar para o cliente
{
perror("fifo escrever");
return EXIT_FAILURE;
}
}

if ((fd1 = open("fifo", O_RDONLY)) == -1) { //abrir fifo para ler
perror("fifo ler");
return EXIT_FAILURE;
}

if ((fd2 = open("fifo2", O_WRONLY)) == -1) { //abrir fifo2 para escrita
perror("fifo escrever");
return EXIT_FAILURE;
}

while(1)
{
read(fd1,&buffer,sizeof(buffer)); //Lê o que se encontra no buffer
t = strtok(buffer," -:"); //Vai quebrando o que está no buffer à medida que faz o ciclo infinito

while( t != NULL)
{
if(i==1)
{
strcpy(c,t); //Vai copiando o que foi quebrado para c
}
if(i==1 && strcmp(c,"l")==0)
{
printf("Listar tarefas");
listartarefas(tf);
}
if(i==2 && strcmp(c,"c")==0)
{
n=atoi(t);
v=0;
cancelartarefa(tf,&num, n);
}
t = strtok(NULL, " -:");
i++;
}
v=1;
i=0;

memset(buffer,0, sizeof(buffer));

sleep(2);
}
close(fd1);
close(fd2);
remove("fifo");
remove ("fifo2");

return EXIT_SUCCESS;
}

最佳答案

  1. 条件不确定

    t = strtok(buffer," -:");

    while( t != NULL)
    {
    if(i==1)
    {
    strcpy(c,t); //Vai copiando o que foi quebrado para c
    }
    if(i==1 && strcmp(c,"l")==0)
    {
    printf("Listar tarefas");
    listartarefas(tf);
    }
    if(i==2 && strcmp(c,"c")==0)
    {
    n=atoi(t);
    v=0;
    cancelartarefa(tf,&num, n);
    }

    第一次调用 strtok() 返回第一个标记(命令)。此时,i == 0 因此不会采用任何分支。同样,当您解析第二个标记(参数)时,i == 1,因此第三个分支也不会被采用。您需要从零开始的索引:

    t = strtok(buffer," -:");

    while( t != NULL)
    {
    if(i==0)
    {
    strcpy(c,t); //Vai copiando o que foi quebrado para c
    }
    if(i==0 && strcmp(c,"l")==0)
    {
    printf("Listar tarefas");
    listartarefas(tf);
    }
    if(i==1 && strcmp(c,"c")==0)
    {
    n=atoi(t);
    v=0;
    cancelartarefa(tf,&num, n);
    }
  2. 功能错误

    void listartarefas(Task **tf)
    {
    ...
    if(tf[i]->tipo == 1)
    {
    printf("Agendada:\n");
    printf("%d\n",tf[i]->identf);
    printf("%s\n",(tf[i]->path));
    ...
    }

    Task tf[TAM_MAX];
    ...
    listartarefas(tf);

    当在表达式中使用数组 (tf) 时,它(有一些异常(exception))会转换为指向其第一个元素的指针。这意味着您正在将 Task * 传递给 listartarefas(),但该函数需要一个 Task **。这显然行不通。

    如果您在启用一组正常警告的情况下编译代码,编译器将通知您此类问题。根据您提供给我们的信息,我建议您更改 listarefas() 函数,如下所示:

    void listartarefas(Task *tf)
    {
    ...
    if(tf[i].tipo == 1)
    {
    printf("Agendada:\n");
    printf("%d\n",tf[i].identf);
    printf("%s\n",(tf[i].path));
    ...
    }
  3. 其他观察结果

    read(fd1,&buffer,sizeof(buffer)); //Lê o que se encontra no buffer

    您从未测试过 read() 的返回值。

    <小时/>
    while(1)
    {
    ...
    }

    您似乎没有办法退出此循环。

    <小时/>
    strcpy(c,t);

    c 中只能容纳一个字符和一个终止零,但您从不检查标记 t 的长度。这很容易导致缓冲区溢出。

关于无法输入 if 条件和函数返回段错误错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27981747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com