C语言实现数字频率统计时大输入场景结果错误问题求解
代码问题分析
你的代码存在两个核心错误,直接导致长字符串输入时计数结果不符合预期:
- 未过滤非数字字符,存在数组越界访问
你的逻辑默认输入的所有字符都是数字,直接用s[index++] - 48的结果作为下标访问长度为10的count数组。但输入字符串中包含大量字母等非数字字符,这类字符减去48后得到的数值不在0~9范围内,越界访问数组属于未定义行为,会篡改内存中的计数数据,导致结果错误。 - 输入缓冲区长度不足,存在缓冲区溢出
你定义的字符数组s长度仅为1000,最多只能存储999个有效字符(需要预留1位存储字符串结束符\0)。你提供的测试长字符串的长度已经超过999,用scanf("%s", s)读取时会发生缓冲区溢出,覆盖栈上其他内存区域的内容,进一步引发计数异常。
修正后代码
#include <stdio.h> #include <string.h> #include <ctype.h> // 引入isdigit函数判断字符是否为数字 int main() { // 扩大缓冲区长度,足够容纳测试字符串 char s[2048]; scanf("%s", s); int len = strlen(s); int count[10] = {0}; for(int index = 0; index < len; index++){ // 仅对数字字符做计数处理 if(isdigit(s[index])){ count[s[index] - '0']++; // 用'0'代替48,可读性更强,兼容不同字符集 } } for(int i = 0; i < 10; i++) printf("%d ", count[i]); return 0; }
内容的提问来源于stack exchange,提问作者Aftab Shaikh
相关产品推荐
相关产品推荐

