You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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’,无法正确访问字符串单个字符。


错误原因

  1. 结构体访问语法错误:
    temps是avg_temp类型的数组,temps[i]是单个avg_temp结构体实例,不是数组或指针,不能用temps[i][b]的下标方式访问。正确的单个字符访问方式应为temps[i].city[b]——因为temps[i].city是CS50定义的string(即char*),指向字符串首地址,可通过下标访问单个字符。

  2. 其他逻辑错误:

    • 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分配可写内存:

  1. 在main中用strdup复制字符串:
temps[0].city = strdup("Austin");
// 其他城市同理
  1. 正确的字符访问与交换逻辑:
// 交换两个字符串的字符(仅示例,实际无需这么做)
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:32:06