You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言开发问询:使用scanf()获取整数时如何禁止输入非0-9字符?

基于scanf()限制用户仅输入数字的实现方案

首先明确前提:没有办法直接禁止用户在键盘按下非0-9的按键,但是可以通过scanf()的校验逻辑,实现仅接受数字输入、非法输入自动忽略并提示重输的效果,和“禁止输入非数字”的使用体验完全一致。

常用实现方法

方法1:利用scanf()返回值校验整数输入

scanf()的返回值代表成功匹配并赋值的变量个数,当使用%d读取整数时:

  • 输入内容为合法整数时返回1
  • 输入包含非数字字符、匹配失败时返回0,且非法内容会残留在输入缓冲区,需要手动清空后重新读取
    示例代码:
#include <stdio.h>

int main() {
    int input_num;
    int scan_ret;
    printf("请输入整数:");
    // 持续读取直到拿到合法整数
    while ((scan_ret = scanf("%d", &input_num)) != 1) {
        // 清空输入缓冲区中所有残留的非法字符
        while (getchar() != '\n');
        printf("输入无效,请仅输入0-9组成的整数:");
    }
    printf("有效输入为:%d", input_num);
    return 0;
}

方法2:使用扫描集限制仅匹配数字字符

如果需要更细粒度的控制(比如仅接受单个数字、不接受正负号等),可以用scanf()的%[char-set]扫描集格式符,%[0-9]只会匹配0到9的字符,碰到其他字符直接终止匹配:
示例代码:

#include <stdio.h>

int main() {
    char digit_buf[2]; // 预留1位存储字符串结束符
    printf("请输入单个数字:");
    while (scanf("%1[0-9]", digit_buf) != 1) {
        while (getchar() != '\n');
        printf("输入无效,请仅输入0-9的单个数字:");
    }
    int num = digit_buf[0] - '0';
    printf("有效输入数字为:%d", num);
    return 0;
}

注意事项

  • 匹配失败后必须清空输入缓冲区的残留字符,否则非法内容会被下一次scanf()直接读取,导致无限循环
  • 如果需要支持正负整数,可以把扫描集调整为%[0-9+-],后续追加逻辑判断正负号仅出现在首位即可
  • 如果需要读取多个整数,把上述校验逻辑套入循环即可,每读取一个整数就做一次校验

内容的提问来源于stack exchange,提问作者LAlchimista

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:24:10