C语言数字频率统计代码运行输出全0,求助排查逻辑错误
代码错误点及修正方案
存在的逻辑错误
- 核心需求适配错误:你需要统计字母数字混合字符串中的数字频率,但使用
atoi(s)将字符串转整数的操作完全不符合需求,atoi遇到第一个非数字字符就会终止转换,若字符串开头为字母会直接返回0,不仅会丢失所有字母后的数字内容,也完全无法提取字母穿插场景下的数字,这是你输出全为0的最主要原因。 - 长度计算逻辑错误:你通过整数反复除以10的方式计算长度,若
atoi返回0(比如输入开头是字母),len会被计算为0,后续两层循环都不会执行,count自然没有累加。 - 统计方式存在天然缺陷:就算输入全是数字,用整数取余统计的方式也会丢失前导0的计数,若输入数字长度超过int类型存储上限还会出现溢出问题。
正确实现方案
不需要转整数,直接遍历原始输入字符串的每个字符判断计数即可:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char *s; s = malloc(1024 * sizeof(char)); scanf("%[^\n]", s); s = realloc(s, strlen(s) + 1); int count[10] = {0}; // 遍历字符串所有字符 for(int i = 0; s[i] != '\0'; i++){ // 判断是否为数字字符 if(s[i] >= '0' && s[i] <= '9'){ count[s[i] - '0']++; } } // 输出0-9的出现频率 for(int j = 0; j < 10; j++){ printf("%d ", count[j]); } free(s); return 0; }
内容的提问来源于stack exchange,提问作者KaraageAndKamehameha
相关产品推荐
相关产品推荐

