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

求助:C++中所有[i]下标访问均报‘subscripted value...’错误

问题分析与修复

核心报错原因

你遇到的subscripted value is not an array, pointer, or vector错误,根源在getData()函数的返回值处理:

  • getData()声明返回int,实际只返回了0,完全没返回你创建的vector<int> weeklyScore。
  • 在highScore()、lowScore()、ave()中,auto weeklyScore = getData();得到的weeklyScore是int类型(因为getData返回int),而非vector。对int使用[i]下标自然会报错——int不是数组、指针或vector类型,不支持下标访问。

修复步骤

  1. 修正getData的返回类型和返回值
    把getData()的返回类型从int改为vector<int>,并在函数末尾返回创建好的vector:

    vector<int> getData() {
        vector<int> weeklyScore(16, 0);
        // 原有的输入逻辑保持不变
        return weeklyScore; // 新增返回vector语句
    }
    
  2. 避免重复调用getData(优化体验)
    当前代码中三个分析函数各自调用getData(),会让用户重复输入三次分数,这明显不符合需求。应该在main()中只调用一次getData(),再把结果传递给三个分析函数:

    // 修改highScore,接收vector参数
    int highScore(const vector<int>& weeklyScore) {
        int high = 0;
        int ihigh = 0; // 提前声明并初始化ihigh
        for (int i = 0; i < 16; i++) {
            if (weeklyScore[i] > high) {
                high = weeklyScore[i];
                ihigh = i;
            }
        }
        cout << "The highest score is " << high << " in module " << ihigh+1 << endl;
        return 0;
    }
    
    // lowScore和ave函数做同样修改
    int lowScore(const vector<int>& weeklyScore) {
        int low = 16;
        int ilow = 0;
        for (int i = 0; i < 16; i++) {
            if (weeklyScore[i] < low) {
                low = weeklyScore[i];
                ilow = i;
            }
        }
        cout << "The lowest score is " << low << " in module " << ilow+1 << endl;
        return 0;
    }
    
    int ave(const vector<int>& weeklyScore) {
        int sum = 0;
        for (int i = 0; i < 16; i++) {
            sum += weeklyScore[i];
        }
        int average = sum / 16;
        cout << "The average score is " << average << endl; // 新增输出结果语句
        return 0;
    }
    
    // 修改main函数,只调用一次getData
    int main() {
        vector<int> scores = getData();
        highScore(scores);
        lowScore(scores);
        ave(scores);
        return 0;
    }
    
  3. 修复其他小问题

    • 删掉highScore()中重复声明的int high;。
    • 给highScore()的ihigh、lowScore()的ilow添加声明和初始化,避免未定义行为。
    • 在ave()中添加输出平均分数的语句,否则计算结果不会显示。

修复后的完整代码

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<int> getData() {
    vector<int> weeklyScore(16, 0);

    for (int i = 0; i < 16; i++) {
        cout << "Enter quiz score (0-15) for week " << i+1 << " : " << endl;
        cin >> weeklyScore[i];

        if (weeklyScore[i] < 0 || weeklyScore[i] > 15) {
            cout << "Please enter a valid score (0-15): " << endl;
            i--;
        }
    }

    for (int i = 0; i < 16; i++) {
        cout << "Module " << i+1 << ": " << weeklyScore[i] << endl;
    }

    return weeklyScore;
}

int highScore(const vector<int>& weeklyScore) {
    int high = 0;
    int ihigh = 0;

    for (int i = 0; i < 16; i++) {
        if (weeklyScore[i] > high) {
            high = weeklyScore[i];
            ihigh = i;
        }
    }

    cout << "The highest score is " << high << " in module " << ihigh+1 << endl;
    return 0;
}

int lowScore(const vector<int>& weeklyScore) {
    int low = 16;
    int ilow = 0;

    for (int i = 0; i < 16; i++) {
        if (weeklyScore[i] < low) {
            low = weeklyScore[i];
            ilow = i;
        }
    }

    cout << "The lowest score is " << low << " in module " << ilow+1 << endl;
    return 0;
}

int ave(const vector<int>& weeklyScore) {
    int sum = 0;

    for (int i = 0; i < 16; i++) {
        sum += weeklyScore[i];
    }

    int average = sum / 16;
    cout << "The average score is " << average << endl;
    return 0;
}

int main() {
    vector<int> scores = getData();
    highScore(scores);
    lowScore(scores);
    ave(scores);
    return 0;
}

内容的提问来源于stack exchange,提问作者Islandari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:19:53