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"); } }
关键修复说明
- 调整输出循环的起始值为
BITS_IN_BYTE - 1,确保只访问数组的有效索引(0~7),刚好输出8个灯泡,符合题目要求。 - 新增临时变量
c保存原字符值,避免修改输入字符串text的内容,保持代码的健壮性。
内容的提问来源于stack exchange,提问作者Nyclear
相关产品推荐
相关产品推荐

