C:使用do…while循环将字符串读入结构成员

C:使用do…while循环将字符串读入结构成员,c,C,我在理解如何将字符串读入结构成员数组时遇到问题。我有一个名为“customer”的结构和一个名为“char last_name[20]”的成员。我会提示用户输入他的姓氏,该姓氏将存储在“last_name[20]”变量中。条件是我必须使用do…while循环 代码如下: void get_customer_info(struct customer *p_customer_start, int customer_num) { struct customer *p_customer;

我在理解如何将字符串读入结构成员数组时遇到问题。我有一个名为“customer”的结构和一个名为“char last_name[20]”的成员。我会提示用户输入他的姓氏,该姓氏将存储在“last_name[20]”变量中。条件是我必须使用do…while循环

代码如下:

void get_customer_info(struct customer *p_customer_start, int customer_num)
{
   struct customer *p_customer;

   for (p_customer = p_customer_start; (p_customer - p_customer_start) < 
        customer_num; p_customer++)
   {
      printf("\nCustomer number %d: ", (p_customer - p_customer_start) + 1);

      while (getchar() != NEW_LINE); 

      printf("\n   Enter the customer's last name: ");

      // *THIS PART IS THE PROBLEM* 
      do
      {
         p_customer->last_name = getchar();         
         p_customer->last_name++;
      } while (*p_customer->last_name != NEW_LINE);

   }
   return;
}
void get\u customer\u info(结构客户*p\u客户\u开始,int customer\u num)
{
结构客户*p_客户;
对于(p_客户=p_客户开始);(p_客户-p_客户开始)<
客户数量(p客户++)
{
printf(“\n客户编号%d:”,(p_客户-p_客户开始)+1);
while(getchar()!=新行);
printf(“\n输入客户的姓氏:”);
//*这部分就是问题所在*
做
{
p_customer->last_name=getchar();
p_客户->姓氏++;
}while(*p_customer->last_name!=新行);
}
返回;
}
问题是,由于算法last_name[0]未被检查,在检查新行之前,它会移动到“last_name[1]”。是的,必须使用do…while构造(这是针对类的)


我欣赏任何人的想法

我认为,如果试图操纵数组地址,您可能会遇到比您意识到的更大的问题:-)

您可以通过以下方法避免所有这些问题:

int i = 0;
do {
    p_customer->last_name[i++] = getchar();         
} while (p_customer->last_name[i-1] != NEW_LINE);
p_customer->last_name[i] = '\0';
请记住,这仍然存在缓冲区溢出问题(就像您最初的解决方案一样),因为输入一个名,如
“Pasquale Voldemort Fortescue del Mor”
,将使您的20个字符的数组崩溃

有很多方法可以解决这个问题,但这对课堂作业来说可能没有多大关系(在现实世界中会,但这需要经验):


我认为,如果试图操纵数组地址,您可能会遇到比您意识到的更大的问题:-)

您可以通过以下方法避免所有这些问题:

int i = 0;
do {
    p_customer->last_name[i++] = getchar();         
} while (p_customer->last_name[i-1] != NEW_LINE);
p_customer->last_name[i] = '\0';
请记住,这仍然存在缓冲区溢出问题(就像您最初的解决方案一样),因为输入一个名,如
“Pasquale Voldemort Fortescue del Mor”
,将使您的20个字符的数组崩溃

有很多方法可以解决这个问题,但这对课堂作业来说可能没有多大关系(在现实世界中会,但这需要经验):


您发布的代码无法编译。您提到,
last\u name
是一个数组,但您不能分配或递增数组,因此这两行无效:

p_customer->last_name = getchar();         
p_customer->last_name++;
尝试执行类似操作,这将消除此错误并解决检查第一个字符是否为换行符的问题:

int i = 0;
char ch;

while ((ch = getchar()) != NEW_LINE)
  p_customer->last_name[i++] = ch;

p_customer->last_name[i] = '\0';  // Don't forget the null terminator

您发布的代码无法编译。您提到,
last\u name
是一个数组,但您不能分配或递增数组,因此这两行无效:

p_customer->last_name = getchar();         
p_customer->last_name++;
尝试执行类似操作,这将消除此错误并解决检查第一个字符是否为换行符的问题:

int i = 0;
char ch;

while ((ch = getchar()) != NEW_LINE)
  p_customer->last_name[i++] = ch;

p_customer->last_name[i] = '\0';  // Don't forget the null terminator

好的,没有索引的解决方案是

char *pointer;

/* other code here */
pointer = p_customer->last_name 
do {
    *pointer = getchar();
    pointer += sizeof( char );
} while ( *(pointer - sizeof( char ) )!= NEW_LINE );

如果您想确保不超出数组范围……。只需不要使用do while=)(我总是建议这样做,因为在理解循环条件之前,您必须阅读很多行(在多嵌套函数中,这不是一个真正的可读性问题

好的,没有索引的解决方案

char *pointer;

/* other code here */
pointer = p_customer->last_name 
do {
    *pointer = getchar();
    pointer += sizeof( char );
} while ( *(pointer - sizeof( char ) )!= NEW_LINE );

如果您想确保不超出数组绑定范围……只需不要使用do while=)(我总是建议这样做,因为在理解循环条件之前,您必须阅读很多行(在多嵌套函数中,这不是一个真正的可读性问题,它甚至不会编译:你不能赋值或递增数组;
last\u name=…
last\u name++
都是错误。啊,很抱歉,对于赋值,它应该是“*p\u customer->last\u name=getchar()”,但这让我意识到常量指针(阵列名称)无法移动,我正在考虑将last_name的地址分配给指针,但我不确定如何获取结构成员的地址..增量仍然不起作用。这甚至无法编译:您无法分配或增量数组;
last_name=…
last_name++
都是错误。啊,抱歉,对于分配,它应该不起作用我一直是“*p_customer->last_name=getchar();”,但这让我意识到常量指针(数组的名称)无法移动,我正在考虑将姓氏的地址分配给指针,但我不确定如何获取结构成员的地址。增量仍然不起作用。我知道我可以这样做,但一个do…虽然没有意义,但我只会使用for循环。我更多地考虑指针算术或一些ot她的解决方案不涉及索引,但无论如何都要感谢。好吧,你要求做一个do…while循环,就是这样:-)我看不出对指针的要求。整个练习毫无意义(除了它的教育价值),因为你毫无疑问会在现实世界中使用健壮的输入函数,就像这里最优秀的一个::-)无论如何,我已经为你添加了一个指针版本,以防你想用它来代替。谢谢,这让我知道了如何去做。这真的是为了不实用的目的,但我想它帮助我更好地理解指针和结构。我明白我可以这样做,但是一个do…虽然那样做是没有意义的,我只是使用for循环。我更多地考虑指针算法或其他不涉及索引的解决方案,但无论如何都要感谢。好吧,你要求做一个do…while循环,就是这样:-)我看不出对指针的要求。整个练习是无意义的(除了它的教育价值)由于您无疑会在现实世界中使用健壮的输入函数,就像这里最优秀的一个::-)在任何情况下,我为您添加了一个指针版本,以防您想使用它。谢谢