Проблема с указателем не инициализируется - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь создать программу, которая запрашивает имя пользователя и сумму, которую он должен компании.Проблема в том, что каждый раз, когда я пытаюсь скомпилировать программу, я получаю это предупреждение о том, что «пользователь не может быть инициализирован».Я не совсем уверен, что это значит.Любая помощь, чтобы понять, что я делаю не так?Спасибо!

#define END  '\0'        
#define LENGTH 20          

struct info
{
   char  lastName[LENGTH]; 
   float payment;
};

int customerS();
void accounts(struct info *userStart, int amount);
void changeNames(struct info *userStart, int amount);
void sort(struct info *userStart, int amount);
void results(struct info *userStart, int amount);

int main()
{
   struct info *user;
   int amount;

    while((amount = customers()) != 0)
   {

      accounts(user, amount);
      changeNames(user, amount);
      sortNames(user, amount);
      results(user, amount);
      free(user);
   }

   return 0;
}

int customers()
{
   int choice;

   do
   {      
      printf("\nHow many customers do you have (2 to 300, 0=quit): ",
      scanf("%d", &choice);
   }
   while((choice < 2|| choice > 300) && choice != 0);
return choice;
}

void accounts(struct info *userStart, int amount)
{
   struct info *user;
   char   *name[LENGTH];
   float  owed;

   for(user = userStart; (user - userStart) < amount; user++)
   {
      scanf (" %s", name[LENGTH]);
      getchar();
      do
      {
         name[LENGTH] = getchar();
         name[LENGTH]++;
      }
      while(!('\n'));
      user->lastName[LENGTH + 1] = END;
      scanf("%f", &owed);
      user->payment = owed;
   }
   return;
}

void changeNames(struct info *userStart, int amount)
{
   char *fast = &userStart->lastName[LENGTH],
        *slow = &userStart->lastName[LENGTH];

   if(tolower(*fast))
      *slow++ = toupper(*fast);       
   while(*fast != END)
   {
      if(!isspace(*fast) || isalpha(*fast))
         *slow++ = tolower(*fast);
      fast++;
   }
   *slow = END;
   return;
}

void sort(struct info *userStart, int amount)
{
   struct info *user;
   char *in,
        *out,
        temp;

   for(out = user->lastName; (out - userStart->lastName) < amount; out++)
   {
      for(in = out + 1; (in - userStart->lastName) < amount; in++)
      {
         if(strcmp(user->lastName, userStart->lastName))
         {
            temp = *out;
            *out = *in;
            *in = temp;
         }
      }
   }
   return;
}
void results(struct info *userStart, int amount)
{
   struct info *user;
   printf("\nName: %s        Payment: $%.2f", user->lastName,  user->payment);
   return;
}

1 Ответ

0 голосов
/ 17 октября 2018

struct info * user;

Распределяет указатель на пользовательскую структуру, а не на саму структуру.

Таким образом, вы можете разместить ее в стеке через struct info user; и передать & userк функциям, или динамически распределяется через user = (struct info*)malloc( sizeof(struct info) ).

В любом случае следует избегать ошибки сегментации (поскольку указатель не инициализирован)...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...