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

时间:2010-11-02 01:22:03

标签: 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;

   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;
}

问题是,使用该算法不检查last_name [0],它会在检查新行之前移至'last_name [1]'。是的,必须使用do ... while结构(这是一个类)。

我很感激任何人的想法。

3 个答案:

答案 0 :(得分:3)

我认为你可能会遇到比你想象的更大的问题,试图操纵一个数组地址: - )

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

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();
    if (i < sizeof (p_customer->last_name) - 1)  // NEVER got to 20
        i++;
} while (p_customer->last_name[i-1] != NEW_LINE);
p_customer->last_name[i] = '\0';

如果真的想要它的指针版本,那很容易:

char *p = p_customer->last_name;
do {
    *p = getchar();
    if (p != &(p_customer->last_name[sizeof(p_customer->last_name) - 1])
        p++;
} while (*(p-1) != NEW_LINE);
*p = '\0';

答案 1 :(得分:0)

您发布的代码无法编译。您提到last_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

答案 2 :(得分:0)

好的, NO INDEXES 的解决方案是;

char *pointer;

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

如果你想确保不要超出数组绑定.......只是不要使用do while =)(我总是推荐,因为你必须在理解循环条件之前阅读很多行(在多功能功能中,这不是真正的可读性问题