2012-06-24 64 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 –

相關問題