2016-10-25 8 views
-1
typedef struct Books{ 
    char *autor, *titlu, *isbn; 
    int anAparitie; 
    struct Books *next; 
}Carte; 

Carte *first, *last, *p; 

char sir[71]; 
FILE *f; 

int validare() //Date validation 
{ 
    int i; 
    for(i=0 ; i<strlen(p->autor) ; i++) 
     if(!strchr(" -`",p->autor[i]) && !isalpha(p->autor[i])) 
     { 
      printf("\n Error (Autor invalid)"); 
      return 0; 
     } 
    for(i=0 ; i<strlen(p->isbn) ; i++) 
     if(!isdigit(p->isbn[i])) 
     { 
      printf("\n Error (ISBN invalid)"); 
      return 0; 

     } 
    if(p->anAparitie>=2017) 
    { 
     printf("\n Error (An invalid)"); 
     return 0; 
    } 
    return 1; 
} 

void afisareSiSalvareDate() //save and print the list 
{ 
    FILE *g; 
    g = fopen("fis.out","w"); 
    p = first; 
    while(p != NULL){  
     printf("%s,%s,%s,%d\n",p->autor,p->titlu,p->isbn,p->anAparitie); 
     fprintf(g,"%s,%s,%s,%d\n",p->autor,p->titlu,p->isbn,p->anAparitie); 
     p=p->next; 
    } 
    fclose(g); 
} 

void formareData() //List item creation 
{ 
    p = (Carte*)malloc(sizeof(Carte)); 
    if(fgets(sir,70,f)!=NULL){ 
     p->autor = strtok (sir,","); //adding data from sir in my current 
     p->titlu = strtok (NULL,","); 
     p->isbn = strtok (NULL,","); 
     p->anAparitie = atoi(strtok (NULL,";")); 
    }else{ 
     printf("Eroare in timpul citirii datelor"); 
     exit(-101); 
    } 
} 
void formareDate() //Linking the item 
{ 
    formareData(); 
    p->next = NULL;  
    if(last != NULL){ 
     last->next = p; 
    }else{ 
     first = p; 
    } 
    last = p; 
    if(!validare()){   //Validation calling for items data 
     printf("\n Te rugam sa reintroduci datele\n"); 
     exit(101); 
    } 
    printf("Datele au fost adaugate cu succes\n"); 
} 

私は私のリストに2つの新しい項目を追加したいので、formareDate()を2回、afisareSiSalvareDate()を1回呼び出しています。2つ以上のアイテムを追加しているときにリストが正しく作成されないのはなぜですか?

私の最初の変更理由は分かりませんが、彼は最初のアイテムのみにリンクされています。

fis.in場合:

Modoranu Marius,Am fost aici Vol I,1234567,1998; 
Pascalau Dorinel,Viata la Padure,7654321,2005; 

fis.outは次のとおりです。

Pascalau Dorinel,,54321,1998 
Pascalau Dorinel,Viata la Padure,7654321,2005 

問題がありますか?

ありがとうございます!

答えて

0

私たちが推測するのではなく、main()関数も表示する必要があります。 Bookノードは、fomareData()を呼び出すたびにその内容が上書きされるため、解析バッファsirを指すのではなく、文字列のコピーを格納する必要があります。 strtok()の結果の回りにstrdup()をラップすることを検討してください。

リストノードを破棄するときには、free()これらの文字列に責任があることに注意してください。

関連する問題