C 语言中的数字频率问题,无法为大输入获得正确的频率

Posted

技术标签:

【中文标题】C 语言中的数字频率问题,无法为大输入获得正确的频率【英文标题】:Digit Freqency Problem in C, Not getting correct frequency for large input 【发布时间】:2021-10-25 07:05:55 【问题描述】:

问题是获取给定输入字符串中数字的频率

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() 
    
    char s[1000];
    scanf("%s", s);
    int index = 0;
    int len=strlen(s);
    int count[10] = 0;
    
    while(index!=len)
        //printf("%c",s[index]);
        count[s[index++] - 48]++;
    
    
    for(int i = 0; i < 10; i++)
       printf("%d ", count[i]);
    
    return 0;
 

当给定小字符串输入时,它正在工作,但对于以下输入

8g614eggv7n388564l82nl6f35826hrzd533380b7870n4954497308f03wsx6zyr45025845zz55x7576631425l311cj4n9u29f4xje02l35t31m6me078bx421c24cocx83e438g88d069cc39bn6292033q055kk81m4f82798h7pt031mv530g4v7519h6g78z34p228f9z6067emv47e83uj805q805d572k18h077q6zzo22f35k22631l5j6n8fz0u583xkuu392613478x8823119241o6802910551sm8w9or6v78443c8wt63i3ft21d548p79h14i26k65qhbs79h65su27l1waz62m7l155bib1a2w401b8j7s2i719i68tr60492f685g7lx96i077775kq9436s6s6h81f827624583m894314vjvd41385ww0639e6xs8wzn6362a0029233j99097be0124408o90c861281jgu3168765af270z47e208bclp3845799e4p2710i231h P>

我得到的输出为 32 32 39 37 34 34 40 37 46 30

但实际输出是 32 33 40 40 35 35 39 36 48 29

我哪里错了

【问题讨论】:

你没有检查一个值是否是一个数字,所以这个输入的程序访问计数数组的边界之外。 【参考方案1】:

s[index++] - 48 - 如果s[index++] 为“a”,则结果为 97 - 48,为 49。count[49] 超出数组边界访问,导致未定义的行为。

【讨论】:

【参考方案2】:

正如其他answer 中提到的,由于缓冲区溢出,程序中存在未定义的行为。

我建议在更新count 之前使用isdigit() 函数过滤掉非数字。

#include <ctype.h>

...

char c = s[index++];
if (isdigit(c))
   count[c - '0']++;

【讨论】:

以上是关于C 语言中的数字频率问题,无法为大输入获得正确的频率的主要内容,如果未能解决你的问题,请参考以下文章

使用C语言编写猜数字问题

数字图像处理学习笔记(十四)——频域图像增强(图像的频域分析)

c语言中如何通过输入获得数组的对对应下标获得相应的数组元素数据

C语言一个简单的问题:输入一段文本,计算其中每个单词的出现频率:下面是代码

如何通过差分方程分析滤波器的频响特性

C语言中如何实现验证输入的是不是为数字?