将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(),但我无法让程序使用这个名称,而不会出现分段错误。我只需要弄清楚如何配置片段以接受名称并将其放在需要的位置。有完整的函数,但我的问题是将指针分配给结构成员,以及保留名称。