繁体   English   中英

如何使用 struct 计算每个 char 数组的计数时间?

[英]How do I calculate count times for every char array with struct?

struct Page{
 char data[50];
 int count = 0; // ?
};
Page page[50];

我不知道如何保存每个 char 数组的计数。

例如:

input: a c b
page[i].data[0] = a; // a_count = 1
page[i].data[1] = c; // c_count = 1
page[i].data[2] = b; // b_count = 1

我的想法是

paga[i].data[0].count++;

但是,我不知道如何用 struct 来实现。

您需要一个数组来解决此问题,而不是单个 integer count 因此,您可以通过以下方式定义Page

typedef struct Page
{
    char data[50];
    int countChar[TOTAL_CHARS];
} Page;

现在,我们不能像在 function 中那样简单地在结构中初始化数组。 所以我们必须手动初始化countChar[]0 但是,有一个技巧可以让您摆脱这个令人厌烦的过程。 诀窍是使用这样的宏:

#define NEW_PAGE { "", {0} }

并以下列方式使用它:

Page page[50] = NEW_PAGE;

现在,您所要做的就是将字符 map 到countChar[]的索引并将其值增加 1。这可以通过以下方式完成:

page[0].countChar[ch - 'a']++;

这里, ch是输入中的字符。 考虑到所有输入都是小写字母,用'a'减去ch将产生表示字符ch频率的所需索引。 如果ch的可能值都是 ASCII 字符,我们只需将'a'替换为'\0'并相应地更改countChar[]的大小。

这是一个测试这个想法的代码:

#include<stdio.h>
#define NEW_PAGE { "", {0} }
#define TOTAL_CHARS 26

typedef struct Page
{
    char data[50];
    int countChar[TOTAL_CHARS];
} Page;

int main()
{
    Page page[50] = NEW_PAGE;
    char input[] = "hello world";
    char ch;
    int i = 0;
    int frequency;

    while(input[i] != '\0')
    {
        ch = input[i];
        page[0].data[i] = ch;
        page[0].countChar[ch - 'a']++;
        i++;
    }

    for(i=0; i<TOTAL_CHARS; i++)
    {
        frequency = page[0].countChar[i];
        if(frequency != 0)
            printf("%c is present %d times\n", ('a'+i), frequency);
    }
    return 0;
}

您可以拥有一个长度为 26 的整数数组,而不是单个int 。这将保存数组中每个小写字母的计数。

小写字母的 integer 值范围为97 - 122 要将每个字母对应到 26 长度数组中的索引,您需要从每个char的 integer 值中减去 97,以便每个 char 可以对应 0 - 25 的索引。

所以你的结构应该是这样的:

struct Page{
 char data[50];
 int count[26];
};

如果您有一个名为letterchar ,那么您将找到count数组的正确索引并递增它的方式是:

int index = (int)letter - 97;
count[index]++;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM