每个结构项都获取用户键入的最后一个值

时间:2012-06-24 03:35:48

标签: c

我要求d->id将它放在列表中,但是如果我要求多个,则所有列表项都会得到最后一个。

例如,如果for有2次迭代而novo->prato[0]"M1"(这是向用户询问的),novo->prato[1]"M3",职位保持"M3"。为什么呢?

以下是代码:

typedef struct pedido pedido, *ppedido;
typedef struct prato prato, *pprato;

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

struct prato{
    char id[5];
};

int verifica_prato(ppedido p,int j)
{
    FILE *f;
    struct item aux;

    int i=0;

    f = fopen("menu.bin", "rb");
    if(f == NULL){printf("O sistema nao consegue aceder a memoria");return;}

    while((fread(&aux, sizeof(struct item), 1, f)) == 1){
        if((strcmp(p->prato[j]->id, aux.id)) == 0)
            i++;
    }
    fclose(f);

    if(i == 0){
    printf("Prato nao existe no menu.\n");
    return 1;
        }

    if(i > 1)
    return 0;
}


for(i=0;i<novo->n_pratos;i++){
        do{
            printf("ID do prato %d: ", i+1);
            scanf("%s", &d->id);
            novo->prato[i] = d;
            k = verifica_prato(novo,i);

        }while(k != 0);
    }

1 个答案:

答案 0 :(得分:1)

当您执行d时,您正在指定结构novo->prato[i] = d的指针,  因此,每当您对d进行更改时,它都会反映在novo->prato[i],因为prato数组中的所有值都指向同一地址,即d

我不确定你打算做什么,但是在询问用户输入之前,每次循环都可以使用malloc d。请记住,您还需要最终考虑“释放”内存prato[i]