2016-03-26 26 views
-2

Yapmakta olduğum program bir satırdaki satırı okumak için io yönlendirme kullanmaktadır, her satır listede bir kayıttır. Bir yapı listesi yazdırmam gerekiyor ama bir süre döngü içinde olmadıkça yapamıyorum. Önceden bir for döngüsünü kullanarak çalıştı (i = 0, i (lessthan) list.nused; i ++) ama bunu yaptığımda hiçbir şey baskı yok ve hata yok. Herhangi bir yardım harika olurdu, teşekkürler. İşte kodun bir kısmı:C - while döngüsü dışında yapı yazdırılamıyor

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

#define NAMESIZE 20 
#define BLOCK 2 
#define BUFSIZE 512 

typedef struct { 
    char last[NAMESIZE]; 
    char first[NAMESIZE]; 
} name; 
typedef struct { 
    name name; 
    int score; 
} record; 
typedef struct { 
    record **data; 
    size_t nalloc; 
    size_t nused; 
} record_list; 
void list_init(record_list *list) { 
    list->data = NULL; 
    list->nalloc = list->nused = 0; 
} 
int make_list (record_list *list) { 
    int score; 
    size_t i; 
    char line[BUFSIZE]; 
    char fname[NAMESIZE]; 
    char lname[NAMESIZE]; 
    while (fgets(line, BUFSIZE, stdin) != NULL) { 
     if (list->nalloc == list->nused) { 
      record *rec = realloc(list->data, (list->nalloc+BLOCK)*sizeof(record)); 
      if (rec == 0) { 
       fprintf(stderr, "Unable to resize."); 
       clearerr(stderr); 
       return 1; 
      } 
      list->data = &rec; 
      list->nalloc += BLOCK; 
     } 
     if (fgets(line, BUFSIZE, stdin) == NULL) { 
      clearerr(stdin); 
      return 1; 
     } 
     sscanf(line, "%s %s %d", fname, lname, &score); 
     strcpy(list->data[list->nused]->name.first, fname); 
     strcpy(list->data[list->nused]->name.last, lname); 
     list->data[list->nused]->score = score; 
     list->nused = list->nused++; 
     //here is where it is able to print 
     //printf("%s\n", list->data[list->nused]->name.last); 
    } 
    //I would like it to print everything here 
    for (i = 0; i < list->nused; i++) { 
     printf("%s, %s: %d\n", list->data[i]->name.last, 
     list->data[i]->name.first, list->data[i]->score); 
    } 
    return 1; 
} 
int main(int argc, char *argv[]) { 
    record_list list; 
    list_init(&list); 
    make_list(&list); 
} 
+2

Kodunuzun gerçekten derlendiğini iddia ediyor musunuz? 'list' bir işaretçi olduğu için 'list.nused' geçersiz. Yani 'list-> nused' olmalı. Benzer şekilde diğer "liste" alanlarından bazıları için de erişir. Yani açıkça kodunuzu derlemediniz veya bu kodun doğru sürümü değil. – kaylum

+0

@kaylum Üzgünüm, derlemeliyiz – Bobbis

+0

"Should" derlemek? Gerçekten denedin mi? Hala yanlış ve derleme yapmıyor. Kodunuzu derlemek ve çalıştırmak için bile rahatsız etmiyorsunuz gibi görünüyor. Öyleyse anlattığın varsayılan davranışa nasıl güvenebiliriz? – kaylum

cevap

2

Birkaç küçük hata yaptınız. Birincisi, record_list için tanımını değiştirin: Eğer yerine bir işaretçi bir göstericinin bir kayda dair bilgi içermelidir böylece record nesnelerin bir dizi yapacak bellek bloğunu yeniden boyutlandırma vardır

typedef struct { 
    record *data; 
    size_t nalloc; 
    size_t nused; 
} record_list; 

- kullanımını ikincisi, yeniden boyutlandırılabilir bir dizi işaretçiyi yönetmek istiyorsanız. Bu birkaç fazla değişiklik gerektirir:

  • realloc çağrısından sonra atama olur list->data = rec
  • kayıt verilerinin atama yerine işaretçi erişimi (->) üyesi üyesi erişimini (.) kullanır - diğer kelimeler, list->data[list->nused].name.first yerine

list->data[list->nused]->name.first bir diğer ince hata list->nused = list->nused++ sadece yanlış olduğudur. list->nused++ veya list->nused += 1 olmalıdır.

Son hata, her satırı iki kez okuyor olmanızdır. İkinci aramayı fgets'a kaldırabilirsiniz.

Ayrıca, ayırdığınız belleği de ayırmanız gerekir. Ana bilgisayarın sonuna free(list.data) ekleyin.