Возвращаемое значение fscanf и связанный список - PullRequest
0 голосов
/ 29 ноября 2018

Это часть моего кода.

while(1)
    {
      struct client* newnode = malloc(sizeof(client));

      if(head->next != NULL)
      {
        newnode = newnode -> next;
      }

      if(head->next == NULL)
      {
       newnode->next = head->next;
       head->next=newnode;
      }


     ReadEOF = fscanf(fp1,"%d %s %s %s %s\n",&(newnode->ID),newnode->PW,newnode->NAME,newnode->ADDRESS,newnode->PNUM);

     if((ReadEOF)!= 5)
     {
       break;
     }

     ++NumofClient;
     printf("%d",NumofClient);

   }   //make newnodes

Эти коды написаны перед циклом.

 struct client* head=malloc(sizeof(client));
 head->next = NULL;
 int NumofClient = 0;
 int ReadEOF;

Это struct client.

typedef struct client{
  int ID;
  char PW[100],NAME[100],ADDRESS[100],PNUM[100];
  struct client* next;
}client;

Этоэто файл client.txt.

 123 aa aa aa aa aa
 234 bb bb bb bb bb
 567 cc cc cc cc cc

Я ожидал, что значение NumofClient равно 3.

, но я обнаружил, что программа выходит из цикла, когда значение NumofClient равно 1.

Это означает, что возвращаемое значение функции fscanf не было 5 при 2-й попытке.

Или, во время реализации связанного списка произошла ошибка?

Если вам нужно, я с удовольствием напишу полный код в комментарии

1 Ответ

0 голосов
/ 29 ноября 2018

Вы перезаписываете (утечка памяти) и назначаете мусор (не инициализированное значение) для нового узла в:

  if(head->next != NULL)
  {
    newnode = newnode -> next;
  }

Я думаю, что вы хотите

  newnode->next = head;
  head = newnode;
...