C语言位运算符存储0-5000数值,程序输入首值后终止求助
问题分析与修复方案
你的程序输入第一个值就终止的直接原因是变量未初始化,加上位掩码容量严重不足,导致内存访问越界和未定义行为。以下是具体问题和修复步骤:
核心问题
- 变量未初始化:
w和y没有初始值,w的随机值会直接导致访问x[w]时数组越界,触发程序崩溃;y的随机初始值会让位运算结果完全错误。 - 位掩码容量不足:
int类型通常只有32位,最多能表示0-31的数值,而你需要存储0-5000的数值,远超出int的位范围,会导致位运算溢出,行为未定义。 - 缺少输入合法性校验:没有验证用户输入是否在0-5000范围内,非法输入会破坏位掩码或引发错误。
修复后的代码
#include <stdio.h> #include <stdlib.h> #define MAX_VALUE 5000 // 计算所需字节数:5001位 / 8位/字节,向上取整 #define BIT_ARRAY_SIZE ((MAX_VALUE + 1 + 7) / 8) int main(){ // 用unsigned char数组模拟位集合,每个字节存8位,初始化为0 unsigned char bit_mask[BIT_ARRAY_SIZE] = {0}; int input; while (1){ printf("Insert a value between 0 and 5000 (enter -1 to exit): \n"); // 检查输入是否为有效整数,避免非数字输入导致死循环 if (scanf("%d", &input) != 1) { printf("Invalid input, please enter an integer.\n"); // 清除输入缓冲区的垃圾数据 while (getchar() != '\n'); continue; } if (input == -1) { break; } // 校验输入范围 if (input < 0 || input > MAX_VALUE) { printf("Value out of range, please enter 0-5000.\n"); continue; } // 计算对应位的字节索引和位偏移,设置对应位 int byte_idx = input / 8; int bit_idx = input % 8; bit_mask[byte_idx] |= (1 << bit_idx); } printf("\nSorted values:\n"); for (int z = 0; z <= MAX_VALUE; z++) { int byte_idx = z / 8; int bit_idx = z % 8; if (bit_mask[byte_idx] & (1 << bit_idx)) { printf("%d\n", z); } } return 0; }
关键修改说明
- 替换位掩码实现:用
unsigned char数组模拟位集合,解决了int位不足的问题,能容纳0-5000的所有数值标记。 - 初始化所有变量:避免随机内存地址访问导致的崩溃。
- 添加输入校验:验证输入是否为整数、是否在合法范围,提升程序健壮性。
- 移除无用数组:原代码中的
x[200]数组完全多余,因为只需要记录哪些值出现过,不需要存储所有输入值。
内容的提问来源于stack exchange,提问作者Andrew77
相关产品推荐
相关产品推荐

