表达式必须是结构指针上的可修改左值

Posted

技术标签:

【中文标题】表达式必须是结构指针上的可修改左值【英文标题】:expression must be a modifiable lvalue on struct pointer 【发布时间】:2016-04-28 13:26:18 【问题描述】:

我正在尝试用数组“temp”中的值填充项目类型“temp” 字段”(包含字符串)我的 ptemp 指针上出现“表达式必须是可修改的左值”错误。

typedef struct _item 
   char item_name[ITEM_NAME_LENGTH];
   char department[DEPARTMENT_NAME_LENGTH];
   char expiration_date[EXPIRATION_DATE_STRING_LENGTH];
   double price;
   int available; Item;

Item create_item(char *s) 
    Item temp, *ptemp;
    ptemp = &temp;
    char temp_fields[5];
    int n = 0;
    n = seperate_fields(s, "_*_", temp_fields);
    ptemp->item_name = temp_fields[0];

谁能解释为什么会这样?我试图修改指针指向的值。假设是可修改的

感谢任何提前回答的人

项目创建的编辑代码

Item create_item(char *s) 
Item temp, *ptemp;
char *ptrend;
char *temp_fields[5];
int n = 0;
ptemp = &temp;
n = seperate_fields(s, "_*_", temp_fields);
strcpy(ptemp->item_name, temp_fields[0]);
strcpy(ptemp->department,temp_fields[1]);
strcpy(ptemp->expiration_date, temp_fields[2]);
ptemp->price = strtod(temp_fields[3], &ptrend);
ptemp->available = atoi(temp_fields[4]);
return temp;

【问题讨论】:

ptemp->item_name 是一个数组名。你不能分配它。 这似乎是了解使用float和/或double时许多值和计算缺乏准确性的好时机您可能还想了解round()函数,在 math.h 中找到,ceil()floor() @user3629249 谢谢!! 【参考方案1】:

您正在尝试复制一个字符串,但您不能为此使用 =,因为目标是一个数组,您不能只在 C 中分配数组。而不是这个:

ptemp->item_name = temp_fields[0];

你可以这样做:

strncpy(ptemp->item_name, temp_fields, ITEM_NAME_LENGTH);
ptemp->item_name[ITEM_NAME_LENGTH - 1] = '\0';

注意我没有使用temp_fields[0],因为那只是一个字符,这没有任何意义。还要注意strncpy() 之后的显式空终止,因为如果空间不足,该函数不会空终止输出。

【讨论】:

好吧,我设法通过仅将 * 添加到临时字段并使用 strcpy 复制字符串来解决此问题。这个方法有问题吗? 如果您问我您的最新代码是否损坏,您必须运行它并查看,或者将其编辑到您的问题中。我不知道您所说的“仅在临时字段中添加 *”是什么意思。 它返回一个小 0.00000001 的值 @Beginner:浮点数不准确。比预期值小 0.00000001 的值可能是您希望使用浮点数的最佳值,具体取决于所涉及的实际值的大小。阅读有关 IEEE 浮点的更多信息。

以上是关于表达式必须是结构指针上的可修改左值的主要内容,如果未能解决你的问题,请参考以下文章

表达式必须是带有枚举的可修改左值

指向函数指针的指针 - 表达式必须是可修改的左值

表达式必须是可修改的左值(字符数组)

C 错误:表达式必须是可修改的左值

为啥我得到的表达式必须是可修改的左值?

错误:表达式必须是可修改的左值