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
相关产品推荐
相关产品推荐

