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

CS50第二周Bulbs问题:数组声明冲突与变长对象初始化错误求助

解决CS50 Bulbs问题的数组错误

先给你理清楚代码里的两个核心问题,以及修复方案:

错误原因拆解

  1. 变量遮蔽(declaration shadows local variable)
    你在main里已经声明了int array[7];,但在if/else块里又重复声明了同名的int array[h]——这相当于在局部作用域里又创建了一个和外层同名的变量,直接遮蔽了外层的数组,编译器就会报错。而且你根本不需要重新声明数组,直接给已经存在的数组元素赋值就行。

  2. 变长数组无法初始化(Variable-sized object may not be initialized)
    C语言里,如果用变量(比如h)来声明数组大小,这个数组属于「变长数组」,而变长数组是不允许在声明的时候直接初始化的(比如int array[h]=1;这种写法本身就违规)。而且你这里的需求是存8位二进制,完全可以用固定大小的数组,根本不需要变长数组。

修复后的代码

#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    char* message = get_string("message:");
    int i = 0;
    int array[8]; // 固定大小8,对应8位二进制,解决变长问题

    while (message[i] != '\0')
    {
        int j = message[i]; // 获取字符的ASCII值
        // 处理当前字符的8位二进制,h从7到0对应从高位到低位
        for (int h = 7; h >= 0; h--)  
        {
            if (j % 2 == 1)
            {
                array[h] = 1; // 直接给数组元素赋值,不再重新声明数组
                j = j / 2;
            }          
            else
            {
                array[h] = 0;
                j = j / 2;
            }
        }
        // 处理完当前字符的所有位后,再输出数组
        for (int y = 0; y < 8; y++)
        {
            printf("%i", array[y]);
        }
        printf("\n");
        i++; // 处理完一个字符后,再移到下一个,之前位置错了
    }
    printf("\n");
}

额外的几个小问题(顺便提一下,不影响当前核心错误)

  • 你之前声明的array[7]大小不够,8位二进制需要大小为8的数组;
  • h变量之前没有声明,C语言要求变量必须先声明再使用;
  • i++的位置之前在h的循环里,会导致每处理一个二进制位就跳到下一个字符,完全错误,现在移到while循环末尾才是正确的;
  • 你之前在h的循环里就输出数组,会导致每次处理一个位就输出一遍数组,现在调整到处理完所有位后再输出,才是每个字符对应一行8位二进制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:10:14