如何在列表项中保存字符串? (C)

时间:2012-06-25 08:22:57

标签: c

我无法将此字符串复制到列表中的一个数组中,程序在到达该行时会崩溃。你能帮忙解决这个问题吗?谢谢。

这是代码。

typedef struct pedido pedido, *ppedido;

struct pedido{
    char id[5];
    int prioridade;
    int mesa, n_pratos;
    pprato prato[TAM];
    ppedido prox;
};

struct prato{
    char id[5];
};


ppedido AdicionaPratoMenu(ppedido lista, char ped[],char idprato[])
{
    int i,j=0,m=0;

    while(lista != NULL){
        if((strcmp(lista->id, ped)) == 0)
        {
            for(i=0;i<lista->n_pratos;i++)
            {
                m++;
            }

            strcpy(lista->prato[m]->id,idprato);   //This is where it goes wrong

        }
        lista=lista->prox;
    }

    return lista;
}

4 个答案:

答案 0 :(得分:1)

我假设你忽略了这里包括:

typedef struct prato pprato; 

有两个潜在的问题:

  1. strlen(idprato)等于什么?我的猜测是5或更高。
      请改用strncpy(lista->prato[m]->id, idprato, 4);
  2. 执行m时,
  3. TAM必须小于strcpy。当您在for循环中递增m时,您还应添加m < TAM,或者只使用此循环:for (m = 0; m<lista->n_pratos; m++);
  4. 一般提示:始终使用strncmp代替strcmp;和strncpy代替strcpy。即使idprato的长度始终为4。

答案 1 :(得分:1)

如果TAM == lista->n_pratos

,这是一种可能的超出界限的访问权限
strcpy(lista->prato[m]->id,idprato);

因为前一个for循环只会以TAM == m结尾(C中的数组索引从0开始)。要更正,请在致电m < TAM之前确保strcpy()

答案 2 :(得分:0)

您需要检查

  1. 在,lista->prato[m]'m'小于pprato prato[TAM];
  2. 中的'TAM'
  3. idprato的长度小于5(这是您定义的)。

答案 3 :(得分:0)

我假设'pprato'是指向'struct prato'的指针。如果是这样,你有一个指向'struct prato'的指针数组但没有为它们实际分配的内存,然后你试图在strcpy()中取消引用它们。