Присвоение результата getchar () указателю на член структуры - PullRequest
0 голосов
/ 27 октября 2019

Я пытался создать функцию, которая присваивает getchar() указателю (p_customers) члену структуры (last_name), но я продолжаю получать ошибки компилятора или ошибки сегментации. Вот что у меня есть:

/* A customer account receivable record                               */
struct customer
{
   char  last_name[MAX_NAME_LENGTH+1]; /* Customer last name          */
   float amount;                       /* Amount the customer owes    */
   int   priority;                     /* Customer priority           */
};

void get_customers(struct customer *p_customers_start, 
                               int number_customers)
{
   struct customer *p_customers; /* Points to the account receivable  */
                                 /* customer                          */
   char            *p_last_name; /* Points to the last name character */

   /* Loop processing account receivable customer data                */
   for (p_customers=p_customers_start;
       (p_customers-p_customers_start) < number_customers;
        p_customers++)
   {
      /* Print out account receivable customer                        */
      printf(   "\nCustomer #%d:", 
               *p_customers - *p_customers_start + 1);

      /* Obtain last name of customer                                 */
      printf("   \nEnter the customer's last name: ");
      getchar();
      do
      {
          p_customers->last_name++ = getchar();
      }
      while(*p_last_name != NEW_LINE);
      p_last_name = END_OF_STRING;
   }
}

Я понятия не имею, в чем проблема, но кто-нибудь может подсказать мне, как ее исправить?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Вычитание допускается для числовых типов, но структуры не могут быть вычтены друг из друга. Поэтому, когда вы говорите «* p_customers - * p_customers_start + 1», для «*p_customers_start+1" and "*p_customers - <previous_expression>» нет смысла.

Например, если в структуре есть записи сотрудников, что означает вычитание одного из другого?

Надеюсь, вам нужен номер текущего клиента. Если да, вы можете использовать просто "p_customers - p_customers_start +1".

. Имя массива является" постоянным указателем ". Поэтому его нельзя изменить. Когда вы говорите" p_customers->last_name++ ", вы пытаетесь изменитьконстанта (указатель), что недопустимо.

Рассмотрим ситуацию, когда пользователь сначала задает NEWLINE для фамилии, а не фактическую фамилию. И в случае, если длина фамилии превышает MAX_NAME_LENGTH, вы в конечном итогеперезаписывая область за пределами массива last_name. Когда это происходит, вы получаете ошибку сегментации.

0 голосов
/ 27 октября 2019

Можете ли вы опубликовать полный код? Вышеприведенный код слишком неясен, чтобы дать намек на правильный анализ. Тем не менее, я мог бы сделать ниже комментарии, основываясь на предположениях: p_customers-> last_name и p_last_name могут не относиться к одному и тому же местоположению. В результате «last_name ++ = getchar ()» продолжает читать символы и пытается ввести адреса за пределами своего предела. Это вызывает segfault.

...