在输入字符串的struct {ch,int}类型的数组中保存字符和出现

时间:2018-05-02 23:08:11

标签: c

name是输入字符串。

chars是此结构的数组

struct {
    char ch;
    int occurs;
};

我想计算某个字符出现的次数,并在字符数组中保存字符和出现的值。

此外,所有数组字符的ch部分都设置为'\0'int部分设置为0

****我希望代码的结构保持不变,只能在哪里完成修复以及如何完成?

示例:yoyo是字符串输入,我希望每个字符都保存在chars数组中(y2 o2)。

for(j=0;j<strlen(name);j++){
    for(i=0;i<strlen(name);i++){
        if(chars[i].ch=='\0'){
            chars[i].ch=name[i];
            chars[i].occurs=1;
            break;
        }
        else if(chars[j].ch==name[i]){
            chars[i].occurs++;
            break;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

多次阅读你的问题后,我想我理解你的问题了 你想做什么。

我看到你解决的问题是内循环不正确。您 不能只运行strlen(name)次,效率太高,因为这是上层 绑定,但您只需要检查到目前为止读取的所有不同值。此数字平均小于strlen(name)。 此外,您应首先检查已读取的字符是否已在chars中,并仅在其添加时才添加 还没有找到。你应该做的是这样的事情:

// pseudo code
for all characters in name:
    found = False
    for all distinct cached values:
        if character is in cached value:
            found = true
            counter++
    if found == False:
        a new distinct value has been found
        add a new cache entry

所以代码看起来像这样:

Chars chars[50];

size_t len = strlen(name);
size_t dv = 0; // number of distinct values

// initializing to 0
memset(chars, 0, sizeof chars);

for(size_t i = 0; i < len; ++i)
{
    int found = 0;
    for(size_t j = 0; j < dv; ++j)
    {
        if(chars[j].ch == name[i])
        {
            found = 1;
            chars[j].occurs++;
            break; // break inner loop
        }
    }

    if(found == 1)
        continue;

    // checking array bounds
    if(dv == (sizeof chars / sizeof chars[0]) - 1)
    {
        fprintf(stderr, "Too many distinct values, not enough space\n");
        return ERROR_VALUE;
    }

    // a new distinct value has been found
    chars[dv].ch = name[i];
    chars[dv].occurs = 1;
    dv++;
}

printf("The string '%s' has these distinct values:\n", name);
for(size_t i = 0; i < dv; ++i)
{
    printf("%c: %d times\n", chars[i].ch, chars[i].occurs);
}

但就像我说的那样,这不是很有效,最糟糕的情况是O(n²)

更好的方法是将chars声明为256的维度数组 intchars[i]代表ASCII代码中的i个字符:

int chars[256];

size_t len = strlen(name);

// initializing to 0
memset(chars, 0, sizeof chars);

for(size_t i = 0; i < len; ++i)
    chars[(int) name[i]]++;

printf("The string '%s' has these distinct values:\n", name);
for(size_t i = 0; i < 256; ++i)
{
    if(chars[i] > 0)
        printf("%c: %d times\n", (char) i, chars[i]);
}