C语言出现‘subscripted value is not an array...’错误排查求助
结构体数组冒泡排序的字符访问错误分析与解决方法
问题背景
完成CS50结构体与排序算法练习时,目标是对avg_temp结构体数组中的城市7月平均温度进行降序冒泡排序。尝试逐个交换两个城市city字符串字符以完成结构体交换时,代码行temps[i][b].city = temps[i+1][b].city触发错误:‘subscripted value is not an array, pointer, or vector’,无法正确访问字符串单个字符。
错误原因
结构体访问语法错误:
temps是avg_temp类型的数组,temps[i]是单个avg_temp结构体实例,不是数组或指针,不能用temps[i][b]的下标方式访问。正确的单个字符访问方式应为temps[i].city[b]——因为temps[i].city是CS50定义的string(即char*),指向字符串首地址,可通过下标访问单个字符。其他逻辑错误:
loops变量未定义,冒泡排序的循环边界应为NUM_CITIES - 1;sort_cities是void类型,不能返回值,原代码末尾的return语句完全无效;- 温度交换逻辑混乱:通过加减温度值模拟交换的方式完全不符合排序需求;
n的计算仅初始化时使用了前两个城市的长度,未在每次比较不同城市时重新计算;- 内层循环中的
i++会打乱外层冒泡排序的循环变量,导致逻辑混乱。
解决方法
最优方案:直接交换整个结构体
这是最简单高效的方式,结构体为值类型,可直接交换两个avg_temp实例,无需单独处理字符串和温度:
// 正确的降序冒泡排序实现 void sort_cities(void) { int swapped; do { swapped = 0; for (int i = 0; i < NUM_CITIES - 1; i++) { // 按温度降序,前一个温度小于后一个则交换 if (temps[i].temp < temps[i+1].temp) { avg_temp temp = temps[i]; temps[i] = temps[i+1]; temps[i+1] = temp; swapped = 1; } // 温度相同时可选按城市名称排序(示例为升序) else if (temps[i].temp == temps[i+1].temp) { if (strcmp(temps[i].city, temps[i+1].city) > 0) { avg_temp temp = temps[i]; temps[i] = temps[i+1]; temps[i+1] = temp; swapped = 1; } } } } while (swapped); }
该方法直接交换结构体指针和温度值,无需手动处理字符串字符,完全满足需求。
备选方案:手动交换字符串(不推荐)
原代码中city指向的是只读字符串常量,无法直接修改字符。若非要手动交换字符,需先为city分配可写内存:
- 在
main中用strdup复制字符串:
temps[0].city = strdup("Austin"); // 其他城市同理
- 正确的字符访问与交换逻辑:
// 交换两个字符串的字符(仅示例,实际无需这么做) void swap_city_chars(avg_temp *a, avg_temp *b) { int len_a = strlen(a->city); int len_b = strlen(b->city); int max_len = len_a > len_b ? len_a : len_b; // 需确保两个字符串的内存足够容纳对方的字符 a->city = realloc(a->city, max_len + 1); b->city = realloc(b->city, max_len + 1); char temp_char; for (int i = 0; i < max_len; i++) { if (i >= len_a) { b->city[i] = '\0'; break; } if (i >= len_b) { a->city[i] = '\0'; break; } temp_char = a->city[i]; a->city[i] = b->city[i]; b->city[i] = temp_char; } }
但此方法冗余且容易出错,远不如直接交换结构体高效。
内容的提问来源于stack exchange,提问作者Harr
相关产品推荐
相关产品推荐

