C语言程序输入非整数输出1,如何实现7位有效整数输入校验?
问题分析与解决方案
原代码的核心问题有两个:
- 输入非数字时,
scanf读取失败,num保留未初始化的垃圾值,导致后续逻辑错误输出1 - 没有验证输入是否为有效的7位整数,也没处理输入后残留的无效字符
修正后的代码
#include <stdio.h> int main() { int num; int read_status; char extra_char; do { printf("Enter a 7-digit number: "); // 同时读取整数和后续第一个字符,用于检查输入是否纯数字 read_status = scanf("%d%c", &num, &extra_char); // 清空输入缓冲区,避免残留字符干扰下一次输入 while ((getchar()) != '\n'); // 验证条件:读取成功、输入只有数字+换行、是严格7位整数 if (read_status != 2 || extra_char != '\n' || num < 1000000 || num > 9999999) { printf("Invalid input! Please enter a valid 7-digit integer.\n"); } } while (read_status != 2 || extra_char != '\n' || num < 1000000 || num > 9999999); // 逆序输出数字 printf("Reversed number: "); int temp = num; while (temp > 0) { printf("%d", temp % 10); temp /= 10; } printf("\n"); return 0; }
关键改进点
- 输入有效性校验:
- 通过
scanf("%d%c", &num, &extra_char)同时读取整数和后续字符,确保输入没有多余的非数字内容 - 限制
num的范围在1000000到9999999之间,保证是严格的7位整数 - 检查
scanf的返回值是否为2,确认整数和后续字符都成功读取
- 通过
- 缓冲区清理:用
while ((getchar()) != '\n')清空输入缓冲区,避免残留的无效字符影响下一次输入 - 逆序逻辑简化:直接用临时变量处理,去掉冗余的数组和嵌套循环,逻辑更清晰
原代码输出1的原因
当输入非数字(如"qwerty")时,scanf("%7d", &num)读取失败,返回0,此时num是未初始化的栈内存垃圾值。如果这个垃圾值刚好包含数字1的相关位,就会触发if(arr[i])的条件输出1,本质是访问未初始化变量导致的未定义行为。
内容的提问来源于stack exchange,提问作者user19757028
相关产品推荐
相关产品推荐

