我在理解如何将字符串读入结构成员数组时遇到问题。我有一个名为'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结构(这是一个类)。
我很感激任何人的想法。
答案 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 =)(我总是推荐,因为你必须在理解循环条件之前阅读很多行(在多功能功能中,这不是真正的可读性问题