C语言while循环中计数器自动重置导致死循环问题求助
问题原因分析
类型不匹配引发内存覆盖
代码中ab是unsigned char类型数组,每个元素仅占1字节,但scanf使用%d格式符——该格式符要求传入int*类型指针,用于存储4字节整数(x86_64架构下int占4字节)。当scanf向&ab[i]写入4字节数据时,会超出ab[i]的内存范围,覆盖数组后方的内存空间。而变量i的内存位置恰好紧跟在ab数组之后,写入的数据会直接修改i的值,导致计数器被重置,循环无限执行。fflush(stdin)属于未定义行为
C标准明确规定fflush仅对输出流有效,对输入流调用fflush的行为无统一定义,不同编译器处理逻辑不一致,可能引发不可预料的错误。
解决办法
修正
scanf格式符匹配类型
使用%hhu格式符对应unsigned char类型,确保写入数据的大小与目标变量一致:int i; unsigned char ab[7]; printf("Enter numbers : "); i=0; while(i<7) { scanf(" %hhu",&ab[i]); // 替换fflush(stdin)的缓冲区清理代码 int c; while ((c = getchar()) != '\n' && c != EOF); i++; printf("\nvalue of i : %d",i); }替换
fflush(stdin)清理输入缓冲区
用循环读取输入缓冲区残留字符,直到遇到换行符或EOF,避免残留输入影响后续读取:int c; while ((c = getchar()) != '\n' && c != EOF);可选:先读入int变量再转换存储
如果需要输入的整数范围超出unsigned char的0-255区间,可先读取到int变量,校验合法性后再转换存入数组:int i, temp; unsigned char ab[7]; printf("Enter numbers : "); i=0; while(i<7) { scanf(" %d",&temp); // 清理缓冲区 int c; while ((c = getchar()) != '\n' && c != EOF); // 校验输入范围 if(temp >=0 && temp <=255){ ab[i] = (unsigned char)temp; i++; printf("\nvalue of i : %d",i); } else { printf("\nInput out of range, please enter 0-255"); } }
内容的提问来源于stack exchange,提问作者Chetan
相关产品推荐
相关产品推荐

