我编写了一个 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)
在 printcounts 函数中,counts[]从索引 97 ('a') 到 122 ('z') 读取,同时printcounts('a', 'z', counts);从 开始存储频率counts[0]。
大写和小写字母的频率存储在相同的数组位置。
您已经获取了一个足够大的数组来存储每个 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)