C语言实现9位数字char变量输入的循环校验需求
解决C语言中9位数字输入的循环验证与缓冲区溢出问题
修正后的完整代码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <ctype.h> int main() { // 数组大小设为10:9位数字 + 字符串结束符'\0' char NIN[10]; int valid; do { valid = 1; // 默认输入有效 printf("Please enter your 9 digit NIN:\t"); // 限制最多读取9个字符,防止缓冲区溢出 scanf("%9s", NIN); // 检查输入长度是否为9 if (strlen(NIN) != 9) { printf("Error: Input must be exactly 9 digits.\n"); valid = 0; // 清空输入缓冲区的残留字符,避免影响下一次输入 while (getchar() != '\n'); continue; } // 检查每个字符是否都是数字 for (int i = 0; i < 9; i++) { if (!isdigit(NIN[i])) { printf("Error: Input must contain only digits.\n"); valid = 0; // 清空输入缓冲区 while (getchar() != '\n'); break; } } } while (!valid); // 输入无效时循环 printf("Your valid 9-digit NIN is: %s\n", NIN); return 0; }
关键改动说明
- 数组大小调整:原代码中
char NIN[9]无法容纳9位数字(因为C字符串需要末尾的'\0'作为结束标记),改成char NIN[10]才能正确存储9位数字加结束符。 - 安全输入限制:使用
scanf("%9s", NIN),强制限制最多读取9个字符,彻底避免缓冲区溢出问题。 - 循环验证逻辑:用
do-while循环实现“先输入,再验证,无效则重复”的流程,逻辑直观易理解。 - 长度校验:通过
strlen(NIN)获取输入字符串长度,判断是否等于9。 - 数字校验:遍历每个字符,用
isdigit()函数检查是否为数字,确保输入全是数字字符。 - 缓冲区清空:当输入无效(过长或包含非数字)时,用
while(getchar() != '\n')清空输入缓冲区里的残留字符,防止这些残留被下一次scanf读取,导致循环异常。
内容的提问来源于stack exchange,提问作者tyna 007
相关产品推荐
相关产品推荐

