2012-06-24 37 views
0

我要求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); 
    } 
+0

什么是“d”?你应该尽量提供一个最小的(也就是说,没有所有无用的结构域和验证逻辑),这是你的问题的可编辑例子。 – hugomg

+0

就是这样。我忘了把它放在帖子上。抱歉。 pprato d; \t \t d =(struct prato *)malloc(sizeof(prato)); –

+0

我不这么认为... –

回答

1

您分配指针构建d当你做novo->prato[i] = d, 所以每次进行更改d它将在novo->prato[i]因为在普拉托的所有值反映时间阵列指向相同的地址,即d

我不完全确定你打算做什么,但有一种方法可能是每次在循环中malloc d询问用户的输入。请记住,您还需要考虑最终“释放”内存prato[i]

+0

它的作品!谢谢你,小伙伴! :d –

相关问题