CS50第二周Bulbs问题:数组声明冲突与变长对象初始化错误求助
解决CS50 Bulbs问题的数组错误
先给你理清楚代码里的两个核心问题,以及修复方案:
错误原因拆解
变量遮蔽(declaration shadows local variable)
你在main里已经声明了int array[7];,但在if/else块里又重复声明了同名的int array[h]——这相当于在局部作用域里又创建了一个和外层同名的变量,直接遮蔽了外层的数组,编译器就会报错。而且你根本不需要重新声明数组,直接给已经存在的数组元素赋值就行。变长数组无法初始化(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
相关产品推荐
相关产品推荐

