计算字符出现频率始终返回 0

cyb*_*mon 3 c

我编写了一个 C 函数来计算 char 数组中每个字符的频率。该程序可以工作,但是当我使用给定的测试代码运行它时,我得到的频率为 0,但是如果我在自己的解决方案中运行它,我会得到正确的答案。

这是我的代码。

void countchars(const char *array, unsigned int *counts)
{
    int c = 0;
    int k = 0;
    while (array[c] != '\0')
     {
        if (array[c] >= 'a' && array[c] <= 'z' )
        {
            counts[array[c]-'a']++;
        }
        c++;

        if ( array[k] >= 'A' && array[k] <= 'Z' )
        {
             counts[array[c]-'A']++;
        }
        k++;
            
        
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的打印功能。

void printcounts(int min, int max, const unsigned int *counts) {
    for (int i = min; i <= max; i++) {
        printf("%c: %u  ---  ", i, counts[i]);
        if ((i - min + 1) % 6 == 0)
            printf("\n");
    } 
}
Run Code Online (Sandbox Code Playgroud)

这是使用它们的主要功能。

int main(void)
{
    unsigned int counts[256] = { 0 };

    char sample[] = { 'a','b','r','a','c','a','d','a','b','r','a',0 };

    countchars(sample, counts);
    printcounts('a', 'z', counts);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我使用给定的打印计数时得到的输出。

a: 0  ---  b: 0  ---  c: 0  ---  d: 0  ---  e: 0  ---  f: 0  ---  
g: 0  ---  h: 0  ---  i: 0  ---  j: 0  ---  k: 0  ---  l: 0  ---  
m: 0  ---  n: 0  ---  o: 0  ---  p: 0  ---  q: 0  ---  r: 0  ---  
s: 0  ---  t: 0  ---  u: 0  ---  v: 0  ---  w: 0  ---  x: 0  ---  
y: 0  ---  z: 0  --- 
Run Code Online (Sandbox Code Playgroud)

这是预期的输出

a: 5  ---  b: 2  ---  c: 1  ---  d: 1  ---  e: 0  ---  f: 0  ---  
g: 0  ---  h: 0  ---  i: 0  ---  j: 0  ---  k: 0  ---  l: 0  ---  
m: 0  ---  n: 0  ---  o: 0  ---  p: 0  ---  q: 0  ---  r: 2  ---  
s: 0  ---  t: 0  ---  u: 0  ---  v: 0  ---  w: 0  ---  x: 0  ---  
y: 0  ---  z: 0  ---
Run Code Online (Sandbox Code Playgroud)

Pal*_*den 5

问题:

  1. 在 printcounts 函数中,counts[]从索引 97 ('a') 到 122 ('z') 读取,同时printcounts('a', 'z', counts);从 开始存储频率counts[0]

  2. 大写和小写字母的频率存储在相同的数组位置。

解决方案:

您已经获取了一个足够大的数组来存储每个 ASCII 字符的频率。

unsigned int counts[256] = { 0 };

现在您所要做的就是counts[character]每次遇到字符时加 1。无需定义要使用的字符范围并从 开始填充counts[0]

注意:这将计算所有ASCII 字符的频率。

    #include <stdio.h>
    void countchars(const char *array, unsigned int *counts)
    {
        int c = 0;
        while (array[c] != '\0')
         {
            ++counts[(unsigned char)array[c]];
            c++;
         }
     }

    void printcounts(int min, int max, const unsigned int *counts)
    {
        for (int i = min; i <= max; i++)
        {
            printf("%c: %u  ---  ", i, counts[i]);
            if ((i - min + 1) % 6 == 0)
                printf("\n");
        } 
    }

    int main(void)
    {
        unsigned int counts[256] = { 0 };
    
        char sample[] = { 'a','b','r','a','c','a','d','a','b','r','a',0 };
    
        countchars(sample, counts);
        printcounts('a', 'z', counts);
    
        return 0;
    }

Run Code Online (Sandbox Code Playgroud)