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

C语言中isdigit()函数对48-57范围数值无效问题排查求助

问题分析与解决方案

嘿,我一眼就瞅见你代码里的核心问题啦——你把isdigit()函数用错地方了!咱们慢慢来拆解:

核心错误:isdigit的使用逻辑完全搞反了

你用scanf("%i", &input)读取的是整数数值,比如输入数字5,input里存的就是整数5;输入48,存的就是整数48。但isdigit()函数的作用是:检查一个字符的ASCII值是否对应'0'到'9'(也就是ASCII码48到57),它的参数应该是一个字符(或者转成unsigned char的数值)。

所以当你输入整数48时,isdigit(48)会返回真(因为ASCII48就是字符'0'),你的程序就错误地判定这是非法输入,直接退出;而输入普通整数比如10时,isdigit(10)检查的是ASCII10(换行符),返回假,程序反而认为输入合法——这完全和你想要的逻辑反过来了!

修正方案

你的需求是读取整数,直到输入0或者数组满,同时要过滤非法输入(比如字母、符号这类不能解析成整数的内容)。正确的做法是利用scanf()的返回值来判断输入是否有效:scanf("%i", &input)成功读取整数时会返回1,如果输入的是无法解析成整数的内容,会返回0。

修正后的完整代码

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main(){
    int tab[100];
    int input;
    int index = 0, count = 0;
    printf("Podaj liczby:\n");
    
    do{
        // 检查scanf是否成功读取了整数
        if(scanf("%i", &input) != 1){
            printf("Incorrect input");
            // 清理输入缓冲区的垃圾内容,避免死循环
            while(getchar() != '\n');
            return 1;
        }
        // 输入非0的整数才存入数组
        if(input != 0){
            tab[index] = input;
            index++;
        }
    }while(input != 0 && index < 100);
    
    if(index < 2){
        printf("not enough data available");
        return 2;
    }
    
    for(int i = 0; i < index; i++){
        count = 0;
        for(int j = i+1; j < index; j++){
            if(tab[i] == tab[j] && tab[i] != 0) {
                count++;
                tab[j] = 0;
            }
        }
        if(count > 0){
            printf("%i ", tab[i]);
        }
    }
    return 0;
}

关键修改点说明

  • 用scanf的返回值判断输入是否为有效整数,代替错误的isdigit判断
  • 增加了输入缓冲区清理的代码(while(getchar() != '\n');),避免输入非法内容后,scanf一直读取缓冲区的垃圾导致死循环
  • 简化了存入数组的逻辑,只要输入非0就存入,逻辑更清晰

现在你再测试48-57范围内的整数,程序就能正常处理啦!

内容的提问来源于stack exchange,提问作者Michał Matuszewski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 03:48:11