将getchar()的结果分配给结构成员指针

将getchar()的结果分配给结构成员指针,c,getchar,C,Getchar,我一直在尝试创建一个函数,该函数将getchar()分配给指向结构成员(last\u name)的指针(p\u customers),但我不断收到编译器错误或分段错误。以下是我目前掌握的情况: /* A customer account receivable record */ struct customer { char last_name[MAX_NAME_LENGTH+1]; /* Customer last name

我一直在尝试创建一个函数,该函数将
getchar()
分配给指向结构成员(
last\u name
)的指针(
p\u customers
),但我不断收到编译器错误或分段错误。以下是我目前掌握的情况:

/* 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;
   }
}
/*客户应收账款记录*/
结构客户
{
char last_name[最大名称长度+1];/*客户姓氏*/
浮动金额;/*客户所欠的金额*/
int优先级;/*客户优先级*/
};
void get_customers(结构客户*p_客户\u开始,
整数(客户)
{
struct customer*p_customers;/*指向应收账款*/
/*顾客*/
char*p_last_name;/*指向姓氏字符*/
/*循环处理应收账款客户数据*/
对于(p_客户=p_客户\u开始;
(p_客户-p_客户开始)<客户数量;
p_客户(+)
{
/*打印应收账款客户*/
printf(“\n客户#%d:”,
*p_客户-*p_客户_开始+1);
/*获取客户的姓氏*/
printf(“\n输入客户的姓氏:”);
getchar();
做
{
p_customers->last_name++=getchar();
}
while(*p_last_name!=新行);
p_last_name=_字符串的结尾;
}
}

我不知道问题是什么,但有人能告诉我如何解决吗?

你能发布完整的代码吗?上面的代码太模糊,无法给出任何正确分析的提示。然而,基于假设,我可以发表以下评论:
p_客户->姓氏和p_姓氏可能不是指同一位置。结果,“last_name++=getchar()”继续读取字符,并尝试输入超出其限制的地址。这会导致segfault。

允许对数字类型进行减法运算,但结构之间不能进行减法运算。因此,当你说“*p_客户-*p_客户\u开始+1”时,对“
*p_客户\u开始+1”和“*p_客户-
”没有任何意义

例如,如果一个结构有员工记录,那么从一个结构中减去另一个结构意味着什么

我希望您需要当前的客户号码。如果是,您可以只使用“
p\u customers-p\u customers\u start+1”

数组的名称是“常量指针”。所以它永远不会改变。当您说“
p\u customers->last\u name++
”时,您试图更改一个不允许的常量(指针)


考虑这样一种情况,即用户在给出实际姓氏之前,首先给出姓氏的换行符。如果姓氏长度大于MAX_name_length,则会覆盖超出数组姓氏限制的区域。发生这种情况时,您会遇到分段错误。

为什么solo未分配
getchar()
?要读取先前输入留下的假定换行符?您需要检查EOF和换行符,通常的方法是使用
while
循环:
intch;int i=0;而((ch=getchar())!=EOF&&ch!='\n')p_客户->姓氏[i++]=ch
无论您是否有
char last_name[name_SIZE]
字符*姓氏在结构中-但它不能防止缓冲区溢出。在关于大小的问题上没有任何信息,但是您应该检查没有缓冲区溢出。考虑使用FGES/SCANF用一个调用读取整个客户名称。重新设计这些函数毫无意义。我需要使用getchar(),但我无法让程序使用这个名称,而不会出现分段错误。我只需要弄清楚如何配置片段以接受名称并将其放在需要的位置。有完整的函数,但我的问题是将指针分配给结构成员,以及保留名称。