使用C计算包含在数组中的字母字符

时间:2010-03-08 05:29:56

标签: c search arrays char

我在编写一个我已经工作了很长时间的作业问题时遇到了麻烦。 我不确切地知道为什么这个问题要求并且需要对此进行一些澄清,并且还要朝着正确的方向发展。

以下是问题:

  

(2)使用单个下标计数器阵列解决此问题。该程序使用使用C初始化功能定义的字符数组。程序计算每个字母字符a到z的数量(仅计算小写字符)并打印出找到的每个小写字符的出现次数的报告(在整齐的表中)。仅打印至少出现一次的字母的计数。如果它是零,则不打印计数。请勿在解决方案中使用switch语句。注意:如果x的类型为char,则x-'a'是x中字符的ASCII代码与字符“a”之间的差异。例如,如果x保持字符'c',则x-'a'的值为2,而如果x保持字符'd',则x-'a'的值为3.使用以下字符串提供测试结果:

     

“这是练习(2)的文字示例。”

到目前为止,这是我的源代码:

#include<stdio.h>

int main() {

    char c[] = "This is an example of text for exercise (2).";
    char d[26];

    int i;
    int j = 0;
    int k;

    j = 0;

    //char s = 97;

    for(i = 0; i < sizeof(c); i++) {
        for(s = 'a'; s < 'z'; s++){
            if( c[i] == s){

                k++;
                printf("%c,%d\n", s, k);
                k = 0;

            }
        }
    }
    return 0;

}

正如您所看到的,我目前的解决方案有点贫血。 感谢您的帮助,我知道网上的每个人都不一定喜欢帮助其他人做作业。 ; P

5 个答案:

答案 0 :(得分:2)

char c[] = "This is an example of text for exercise (2).";
int d[26] = {0}, i, value;

for(i=0; i < sizeof(c) - 1; i++){ //-1 to exclude terminating NULL
   value = c[i]-'a';
   if(value < 26 && value >= 0) d[value]++;
}

for(i=0; i < 26; i++){
   if(d[i]) printf("Alphabet-%c Count-%d\n", 'a'+i, d[i]);
}

校正。谢谢caf和Leffler。

答案 1 :(得分:2)

问题的目的是让您弄清楚如何有效地将'a''z'之间的字符转换为0到25之间的索引。显然,您可以为此假设ASCII(虽然C标准不保证任何特定字符集),但它具有有用的属性,即'a''z'字符的值是连续的。

完成后,您可以增加数组d中的相应插槽(请注意,您需要将该数组初始化为全零,这可以通过{{{}}来完成。最后,您将扫描数组char d[26] = { 0 };并打印大于零的计数,以及相应的字符(这将涉及反向转换 - 从索引0到25进入角色d'a')。

答案 2 :(得分:2)

幸运的是,您似乎不需要制作适用于EBCDIC计算机(大型机)的解决方案。

您的内部循环需要用条件替换:

if (c[i] is lower-case alphabetic)
    increment the appropriate count in the d-array

完成字符串后,您需要一个循环来扫描d阵列,打印出与该条目相对应的字母以及与其相关的计数。

你的d-array使用'char'作为计数;这对练习没有问题,但你可能需要使用更大的整数类型来进行通用解决方案。您还应确保将其初始化为全零;很难从随机垃圾中获取有意义的信息(并且语言不保证除了垃圾之外的任何东西都将存储在存储d阵列的堆栈中。)

答案 3 :(得分:0)

for(s = 'a'; s < 'z'; s++){ 
    j=0;
    for(i = 0; i < sizeof(c); i++) { 
         if( c[i] == s )
            j++;
    }
    if (j > 0)
        printf("%c,%d\n", s, j); 
}

答案 4 :(得分:0)

char c[] = "This is an example of text for exercise (2).";
char d[26];
int i;
int j;

for(i = 0; i < 26; i++)
{
    d[i] = 0; // Set the frequency of the letter to zero before we start counting.
    for(j = 0; j < strlen(c); j++)
    {
        if(c[j] == i + 'a')
            d[i]++;
    }
    if(d[i] > 0) // If the frequency of the letter is greater than 0, show it.
        printf("%c - %d\n", (i + 'a'), d[i]);
}