如何在C语言中验证用户输入仅含数字?现有代码问题咨询
问题:C语言验证输入是否全为数字字符失败的原因及解决方法
为什么输入中间有非数字字符时不会回到提示?
sscanf("%lld", &ccnum) 的工作逻辑是从输入缓冲区开头匹配连续的数字字符,一旦遇到非数字字符就停止读取。只要它成功读取到至少一个合法数字,就会返回1,循环条件sscanf(...) != 1不成立,循环直接退出。
举个例子:
- 输入
54545j时,sscanf会读取前面的54545存入ccnum,返回1,所以循环结束,不会检查后面的j; - 只有当输入开头没有任何合法数字(比如
asdfgh或a54545)时,sscanf才会返回0,循环才会继续。
当前思路的问题
只用sscanf的返回值判断是不够的——它只关心开头能否匹配目标格式,不会检查整个输入内容是否都是数字,无法满足你“任何包含非数字字符都回到提示”的需求。
解决方法
这里提供两种可靠的实现方案:
方案1:用sscanf配合检查剩余字符
通过扩展格式字符串,读取数字后尝试读取后续字符,判断是否存在非空白的非法字符:
int a; int b; char buffer[100]; char leftover; long long ccnum; do { printf("Please input the credit card number: "); fgets(buffer, sizeof(buffer), stdin); // 读取数字+后续一个字符,判断是否有多余非空白字符 } while (sscanf(buffer, "%lld%c", &ccnum, &leftover) != 1 || (leftover != '\n' && !isspace(leftover)));
- 如果
sscanf返回1,说明数字读完后直接到了换行(或缓冲区末尾),没有多余字符; - 如果返回2,说明后面还有字符,此时检查该字符是否为空白(比如空格),非空白则判定为非法输入。
方案2:遍历缓冲区逐个检查字符
更直观的方式,直接遍历输入的每个字符,确保全为数字:
#include <string.h> #include <ctype.h> // ... 其他变量定义 int a; int b; char buffer[100]; long long ccnum; int is_valid; do { is_valid = 1; printf("Please input the credit card number: "); fgets(buffer, sizeof(buffer), stdin); // 去掉fgets读取到的末尾换行符(如果存在) size_t len = strlen(buffer); if (len > 0 && buffer[len-1] == '\n') { buffer[len-1] = '\0'; } // 逐个字符检查是否为数字 for (int i = 0; buffer[i] != '\0'; i++) { if (!isdigit(buffer[i])) { is_valid = 0; break; } } // 验证通过后再转换为数字 if (is_valid) { ccnum = atoll(buffer); } } while (!is_valid);
这种方式能确保输入的每一个字符都是数字,完全符合你的需求。
额外注意:如果信用卡号长度超过long long的存储范围(比如超过19位),会出现溢出问题,此时建议直接用字符串存储卡号,或者使用更大的数值类型(如unsigned long long)。
内容的提问来源于stack exchange,提问作者the great olive
相关产品推荐
相关产品推荐

