C语言结构体排序assignment to expression with array type错误修复
C语言排序结构体数组成员触发
assignment to expression with array type报错修复 问题场景
实现链表存储的健身用户数据按activity字段排序时,编译阶段触发数组类型赋值错误,相关代码与错误定位如下:
原结构体定义
struct fitnessTracking { char activity[50], unit[50]; int calories; float total, weight, height, bmi; }; struct recordDate { int dd, mm, yyyy; int duration; }; struct user { char username[50]; struct fitnessTracking tracker; struct recordDate record; }; struct Number { struct Number *ptrnext; struct user member; }; struct Number *newptr, *currentptr;
原排序函数实现
void activitySort(struct Number *head){ struct Number *temp = NULL; struct Number *ptr=NULL; currentptr = head; if(head == NULL) return; while(currentptr != NULL){ //while current pointer not null ptr = currentptr->ptrnext; while(ptr != NULL){ if(currentptr->member.tracker.activity > ptr->member.tracker.activity){ temp = currentptr->member.tracker.activity; currentptr->member.tracker.activity = ptr->member.tracker.activity; ptr->member.tracker.activity = temp; }ptr = ptr->ptrnext; }currentptr=currentptr->ptrnext; } }
报错位置
错误触发在以下两行,编译提示error: assignment to expression with array type:
currentptr->member.tracker.activity = ptr->member.tracker.activity; ptr->member.tracker.activity = temp;
错误原因
- C语言中数组属于不可直接赋值的左值,无法通过
=运算符直接完成数组内容的复制,直接对数组名赋值是语法错误 - 直接用
>比较两个char数组的逻辑不成立:数组名在表达式中会退化为首元素内存地址,直接比较的是两个数组的内存位置,不是字符串实际的字典序 - 原代码定义的
temp是struct Number*指针类型,和char[50]的activity字段类型不匹配,且仅尝试交换activity单个字段,排序后会出现运动类型和同记录下的卡路里、时长、用户信息等数据错位的逻辑问题
修复方法
- 引入
<string.h>头文件,使用标准库函数处理字符串:- 用
strcmp()函数比较两个字符串的字典序,函数返回值大于0时表示第一个字符串大于第二个 - 用
strcpy()函数完成字符串内容的复制,不要直接用=给字符数组赋值
- 用
- 排序交换时优先交换整条
struct user记录,避免单字段交换导致的数据错位(C语言中同类型结构体支持直接赋值,无需逐字段复制)
修复后完整代码
#include <string.h> void activitySort(struct Number *head){ struct user temp_member; // 暂存整条用户记录的临时变量 currentptr = head; if(head == NULL) return; while(currentptr != NULL){ struct Number *ptr = currentptr->ptrnext; while(ptr != NULL){ // 按activity字符串字典序比较 if(strcmp(currentptr->member.tracker.activity, ptr->member.tracker.activity) > 0){ // 直接交换整条记录,保证数据关联正确 temp_member = currentptr->member; currentptr->member = ptr->member; ptr->member = temp_member; } ptr = ptr->ptrnext; } currentptr = currentptr->ptrnext; } }
如果业务场景确实只需要交换
activity字段,可将交换逻辑替换为以下字符串复制逻辑,注意临时数组长度要和activity定义的长度一致:char temp_activity[50]; strcpy(temp_activity, currentptr->member.tracker.activity); strcpy(currentptr->member.tracker.activity, ptr->member.tracker.activity); strcpy(ptr->member.tracker.activity, temp_activity);
内容的提问来源于stack exchange,提问作者user16045271
相关产品推荐
相关产品推荐

