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

C语言中如何判断用户输入是否为合法整数

问题原因

你当前代码的问题出在scanf("%d", &cislo)的行为上:它只会读取输入开头的整数部分,遇到非数字字符(比如1.5里的.)就会停止读取,剩下的字符会残留在输入缓冲区中,所以会把1.5误判为1。

解决方案

可以先读取整行输入,再通过strtol函数做严格的整数校验,确保输入除了整数和空白符外没有其他多余字符,修改后的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <limits.h>

int main(int argc, char **argv) {
    char buf[1024];
    char *endptr;
    long cislo;

    printf("ml' nob:\n");
    // 读取整行输入,避免残留未读取字符
    if (fgets(buf, sizeof(buf), stdin) == NULL) {
        printf("luj\n");
        return 0;
    }

    // 尝试将字符串转换为长整数
    cislo = strtol(buf, &endptr, 10);

    // 校验逻辑
    int is_valid = 1;
    // 情况1:没有可转换的有效数字
    if (endptr == buf) {
        is_valid = 0;
    } else {
        // 情况2:转换后还有非空白的多余字符
        while (*endptr != '\0') {
            if (!isspace((unsigned char)*endptr)) {
                is_valid = 0;
                break;
            }
            endptr++;
        }
    }

    if (!is_valid || cislo < INT_MIN || cislo > INT_MAX) {
        printf("luj\n");
    } else if (cislo == 1) {
        printf("Qapla'\n");
        printf("noH QapmeH wo' Qaw'lu'chugh yay chavbe'lu' 'ej wo' choqmeH may' "
               "DoHlu'chugh lujbe'lu'.\n");
    } else if (cislo == 2) {
        printf("Qapla'\n");
        printf("Qu' buSHa'chugh SuvwI', batlhHa' vangchugh, qoj matlhHa'chugh, "
               "pagh ghaH SuvwI''e'.\n");
    } else {
        printf("luj\n");
    }
    return 0;
}

逻辑说明

  • fgets会把用户输入的整行内容全部读到缓冲区里,不会残留未读取的字符
  • strtol转换完成后会通过endptr返回第一个未被转换的字符的地址
  • 遍历endptr之后的所有字符,如果全是空白符(比如换行、空格),说明输入是合法整数,否则就存在多余字符(比如1.5里的.5),判定为非法输入输出luj

该方案可以覆盖所有非纯整数的输入场景,符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:18:03