gpt4 book ai didi

c - 数组/指针 : Left operand must be l-value

转载 作者:行者123 更新时间:2023-11-30 20:06:05 25 4
gpt4 key购买 nike

我刚开始使用 C,在混合指针和数组时我很难掌握。

我收到以下错误:

错误 C2106:'=':左操作数必须是左值

#include <stdio.h>

struct PersonDetails {
char *name;
int *phoneNumber;
};

int* getPhoneNumber(struct PersonDetails *phoneBook[], char* name);

int main() {

struct PersonDetails a;
struct PersonDetails b;
struct PersonDetails people[2];
struct PersonDetails *ptr[2];
char aName = 'T';
int aNum = 123;
char bName = 'O';
int bNum = 456;
a.name = &aName;
a.phoneNumber = &aNum;
b.name = &bName;
b.phoneNumber = &bNum;

people[0] = a;
people[1] = b;
ptr = &people;

printf("%d", *getPhoneNumber(ptr, aName));

return 0;
}

int* getPhoneNumber(struct PersonDetails *phoneBook[], char* name) {
int i;
for (i = 0; i < 2; i++) {
if (*phoneBook[i]->name == *name) return phoneBook[i]->phoneNumber;
}
return 0;
}

它在线上发生:
ptr = &people;

编辑代码:
#include <stdio.h>

struct PersonDetails {
char *name;
int *phoneNumber;
};

int* getPhoneNumber(struct PersonDetails *phoneBook[], char* name);

int main() {
struct PersonDetails a;
struct PersonDetails b;
struct PersonDetails people[2];
struct PersonDetails *ptr;
char aName = 'T';
int aNum = 123;
char bName = 'O';
int bNum = 456;
a.name = &aName;
a.phoneNumber = &aNum;
b.name = &bName;
b.phoneNumber = &bNum;

people[0] = a;
people[1] = b;

ptr = people;

printf("%d", *getPhoneNumber(ptr, aName));

return 0;
}

int* getPhoneNumber(struct PersonDetails *phoneBook, char* name) {
int i;
for (i = 0; i < 2; i++) {
if (*phoneBook[i].name == *name) return phoneBook[i].phoneNumber;
}
return 0;
}

最佳答案

将我在与 OP 对话中的各种评论转化为答案

Because the method getPhoneNumber() requires the parameter struct PersonDetails *phoneBook[].



为什么 getPhoneNumber() 需要那种古怪的类型?您选择使用它一定是有原因的(例如“老师在我正在研究的问题中设置了它”)。否则,参数似乎更有可能应该是 struct PersonDetail *whostruct PersonDetail who[] - 在函数参数列表的上下文中(并且仅在函数参数列表的上下文中)相当于同一件事。

Originally it was PersonDetails *phoneBook, but I didn't think that would work? Am I wrong in thinking that, and how would I go about using that to find a number using a name?



假设您的意思是 struct PersonDetails *phoneBook (您的代码中没有类型 PersonDetails ,但有类型 struct PersonDetails ),那么它可以正常工作。它是一个指针参数,既可以指向单个人的详细信息,也可以指向人员详细信息数组的开头。在函数内部,只要知道数组足够大,就可以谨慎使用 phoneBook[i].namephoneBook[i].number。 (或者,实际上是 phoneBook->namephoneBook->number ,它们指的是 phoneBook 指向的单个元素,或者您可以将其视为使用 0 的有效下标。)

Oh wow, thank you, that helps so much. So I would change ptr to just struct PersonDetails *ptr; as opposed to an array of pointers?



是的——使用 struct PersonDetails *ptr; 就是你所需要的。您正在(意外地)钻研更复杂的结构,这些结构确实在更复杂的情况下占有一席之地,这就是为什么没有人会说“这是错误的”,但它们目前超出了您的需要或您目前的理解。没关系;您刚刚学到的内容可能涵盖了 95% 或更多的现实生活用例。

Okay, it all compiles now, but crashes when executed. I have a feeling it has something to do with how I'm assigning both ptr and people. Do I just delete the people array? I've added an edited section in the question if you could have a look for me please?



您现在正在传递一个 charaName ,该函数需要一个 char * ,即 &aName 。顶部的函数原型(prototype)也与函数定义不匹配;定义是正确的。您需要从原型(prototype)中删除 *[] 但不能同时删除两者。有了它,它就“起作用”了。

请注意,您没有字符串( char * 值不指向以空字符结尾的字符数组),因此您无法进行字符串比较( strcmp() ),但修复它可能是下一阶段的开发。

你的编译器应该已经产生了警告;注意。请记住,它对 C 的了解比您现在多得多!

工作代码
#include <stdio.h>

struct PersonDetails
{
char *name;
int *phoneNumber;
};

int *getPhoneNumber(struct PersonDetails *phoneBook, char *name);

int main(void)
{
struct PersonDetails a;
struct PersonDetails b;
struct PersonDetails people[2];
struct PersonDetails *ptr;
char aName = 'T';
int aNum = 123;
char bName = 'O';
int bNum = 456;
a.name = &aName;
a.phoneNumber = &aNum;
b.name = &bName;
b.phoneNumber = &bNum;

people[0] = a;
people[1] = b;

ptr = people;

printf("%d\n", *getPhoneNumber(ptr, &aName));

return 0;
}

int *getPhoneNumber(struct PersonDetails *phoneBook, char *name)
{
int i;
for (i = 0; i < 2; i++)
{
if (*phoneBook[i].name == *name)
return phoneBook[i].phoneNumber;
}
return 0;
}

请注意,如果找不到“名称”,则如图所示直接打印结果将严重失败(通常)。您将取消引用一个空指针,它会调用未定义的行为 — 坏事™!你真的需要使用:
int *p_number = getPhoneNumber(ptr, &name);
if (p_number == NULL)
printf("No entry for name %c\n", name);
else
printf("Number for %c is %d\n", name, *p_number);

您还应该查看为什么您有 int *number; 而不仅仅是 int number;char *number; 。如果您只是存储一个未格式化的整数,前者会更好;如果您可能需要存储 +44 1395 276679 或类似的东西,后者会更好,尽管您应该考虑 char number[MAX_PHONE_NUMBER_STRING_LEN]; 而不是指针的相对优点。

此外,对于更接近通用的代码,您的函数可能应该被告知电话簿中有多少条目,而不是使用硬连线大小 2(按照任何标准,这都是一个非常小的电话簿) :
int *getPhoneNumber(int n_entries, struct PersonDetails *phoneBook, char *name)
{
int i;
for (i = 0; i < n_entries; i++)
{
if (*phoneBook[i].name == *name)
return phoneBook[i].phoneNumber;
}
return 0;
}

其中数组中的条目数是一个参数。假设您有 C99 或 C11,您也可以明智地将其写为:
int *getPhoneNumber(int n_entries, struct PersonDetails phoneBook[n_entries], char *name)
{
for (int i = 0; i < n_entries; i++)
{
if (*phoneBook[i].name == *name)
return phoneBook[i].phoneNumber;
}
return 0;
}

在这两个最后的示例中,我没有更改结构中的数据类型(即使我认为应该更改它们)。我也没有向指针/数组或名称添加 const 限定符,即使两者都可以合法地被 const 限定。

关于c - 数组/指针 : Left operand must be l-value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27215876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com