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

CS50 Bulbs练习检测异常:终端正常但检测多显示一个灯泡

问题修复:CS50 Bulbs练习额外显示灯泡的问题

错误根源

你的代码存在数组越界访问的问题,这是导致额外灯泡输出的核心原因:
在第三个输出循环中,你写了:

for (int k = BITS_IN_BYTE; k >= 0; k--)

由于BITS_IN_BYTE定义为8,数组binary的索引范围是0~7(共8个元素),当k=8时,binary[8]属于数组外的内存空间,访问这个位置会读取到随机值,从而多输出一个灯泡。终端环境下可能刚好这个随机值的视觉表现不明显,但CS50的检测会严格校验输出长度,因此触发异常。

另外还有一个隐藏问题:你直接修改了text[i]的值,这会破坏原字符串的内容,虽然当前逻辑下只处理一次字符,但属于不良编程习惯。

修复后的代码

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

const int BITS_IN_BYTE = 8;

void print_bulb(int bit);

int main(void)
{
    string text = get_string("What is the text?\n");
    int size = strlen(text);
    for (int i = 0; i < size; i++)
    {
        // 用临时变量保存原字符,避免修改原字符串
        char c = text[i];
        int binary[BITS_IN_BYTE];

        for (int j = 0; j < BITS_IN_BYTE; j++)
        {
            binary[j] = c % 2;
            c /= 2;
        }

        // 修正循环起始值,从7遍历到0,刚好输出8个灯泡
        for (int k = BITS_IN_BYTE - 1; k >= 0; k--)
        {
            print_bulb(binary[k]);
        }

        printf("\n");
    }
}

void print_bulb(int bit)
{
    if (bit == 0)
    {
        // Dark emoji
        printf("\U000026AB");
    }
    else if (bit == 1)
    {
        // Light emoji
        printf("\U0001F7E1");
    }
}

关键修复说明

  1. 调整输出循环的起始值为BITS_IN_BYTE - 1,确保只访问数组的有效索引(0~7),刚好输出8个灯泡,符合题目要求。
  2. 新增临时变量c保存原字符值,避免修改输入字符串text的内容,保持代码的健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:52:40