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

C语言循环执行后数组未更新、打印结果异常问题求助

代码问题汇总
  • 数组越界:定义int levelArray[6]的合法下标范围是05,但原代码全程使用下标16,访问b[6]和levelArray[6]属于越界操作,会篡改未知内存数据,导致运行结果异常。
  • 函数未实际执行:while循环中void updateLevel(playerPoints, levelArray);是函数声明的写法,不是函数调用,updateLevel函数从未被执行,数组自然不会更新。正确调用不需要加返回值类型,直接写updateLevel(playerPoints, levelArray);即可。
  • 打印参数错误:打印时传入&levelArray[x]是取数组元素的内存地址,输出的是地址值而非计数结果,需要删除所有printf中的取地址符&。
  • 输入逻辑错误:第一次输入的playerPoints会被while循环内的scanf直接覆盖,第一个输入值永远不会被处理;同时fflush(stdin)属于C标准未定义行为,仅可用于输出流清空,不可用来处理输入缓冲区。
  • 冗余变量冲突:main函数中定义的int updateLevel和函数名重名,且该变量和displayLevels全程未使用,可直接删除避免编译问题。
修正后完整代码
#include <stdio.h>
#include <stddef.h>
#define SENTINEL -1
void updateLevel (int playerPoints, int b[]);

int main(void)
{
    // 数组下标0~5分别对应等级1~6
    int levelArray[6];
    for (size_t i = 0; i < 6; ++i)
    {
        levelArray[i] = 0;
    }
    int playerPoints;
    printf ("Player points (-1 to quit): ", SENTINEL);
    scanf ("%d", &playerPoints);
    
    while (playerPoints != SENTINEL)
    {
        // 先处理当前输入的数值,再读取下一次输入
        updateLevel(playerPoints, levelArray);
        printf ("Player points (-1 to quit): ", SENTINEL);
        scanf ("%d", &playerPoints);
    }
    printf ("\n");
    printf ("T O T A L S\n");
    printf ("\n");
    printf ("Level 1\t");
    printf ("%d\n", levelArray[0]);
    printf ("Level 2\t");
    printf ("%d\n", levelArray[1]);
    printf ("Level 3\t");
    printf ("%d\n", levelArray[2]);
    printf ("Level 4\t");
    printf ("%d\n", levelArray[3]);
    printf ("Level 5\t");
    printf ("%d\n", levelArray[4]);
    printf ("Level 6\t");
    printf ("%d\n", levelArray[5]);
}

void updateLevel(int playerPoints, int b[])
{
    if ((playerPoints > -1) && (playerPoints < 10))
    {
        b[0]++;
    }   
    if ((playerPoints > 9) && (playerPoints < 20))
    {
        b[1]++;
    }
    if ((playerPoints > 19) && (playerPoints < 30))
    {
        b[2]++;
    }
    if ((playerPoints > 29) && (playerPoints < 40))
    {
        b[3]++;
    }
    if ((playerPoints > 39) && (playerPoints < 50))
    {
        b[4]++;
    }
    if (playerPoints > 49)
    {
        b[5]++;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:36:05