遍历字符数组以查找字母表中每个字母的出现

时间:2019-05-06 21:43:33

标签: c arrays string unix

它可以很好地达到某一点,就像A-G可以算得上一样。但它会打出像I或H这样的字母,并抛出一些疯狂的数字(如17亿次出现),然后尝试在图表中打印出许多星号。我一直对此不敢恭维,无法解决..这个for循环怎么了?有问题的for循环位于第2步

#include <stdio.h>

#define MAXROWS 100
#define NUM_ALPHABETS 26

int main(){

        int count, i, j, k;

        char sentence[MAXROWS];
        char alphabets[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', '$
        int frequency[NUM_ALPHABETS];


// step 1:Write a function that reads a sentence from the keyboard (2 pts)
        printf("Please enter a sentence: \n");
        fgets(sentence, sizeof(sentence), stdin);

// step 2:Find out the frequency of the alphabets  in the sentence, ignore uppercase or lowercase in the sentence(4 pts)

        for(i = 0; sentence[i] != "\n"; i++) {
                for(j = 0; j < NUM_ALPHABETS; j++) {
                        if(tolower(sentence[i]) == tolower(alphabets[j])) {
                                frequency[j]++;
                        }
                }
        }


// step 3: Print the histogram as shown in the screenshot(4 pts)

        printf("%12s%12s%10s\n", "Alphabets", "Frequency", "Histogram");
        for(j = 0; j < NUM_ALPHABETS; j++) {
                printf("%12c%12d     ", alphabets[j], frequency[j]);
                for(k = 0; k < frequency[j]; k++) {
                        printf("*");
                }
                printf("\n");
        }

        return 0;
}

它应该打印出一个图表,并且在一定程度上起作用。但是一旦它碰到了一些随机字母(每次都不相同),就会出现大约10亿或20亿次事件(有时甚至是负数)

1 个答案:

答案 0 :(得分:0)

您是否依赖于将frequency []数组初始化为0s?

您还可以将步骤2编写为:

for(i = 0; sentence[i] != "\n"; i++) {
        if (isalpha(sentence[i]) {
                int index = tolower(sentence[i]) - 'a';
                frequency[index ]++;
        }
}

p.s。注意单引号与双引号:

for(i = 0; sentence[i] != "\n"; i++)

这些字符应该在'\ n'周围用单引号引起来,以表示字符。

正如其他人指出的那样,您需要初始化frequency。有三种方法可以执行此操作:提供一个初始化程序,编写一个将每个元素设置为零的循环,或调用memset()。这段代码可以完成所有三个操作:

int frequency[26] = { 0 };
for (int i = 0; i < 26; i++)
    frequency[i] = 0;
memset(frequency, 0, sizeof(frequency));

请注意,frequency的命名错误,因为它实际上包含每个字母的出现次数,而不是它们的出现频率。要获得频率,您必须除以读取的字符总数。 MAXROWS也被错误命名,因为“行”与“行”同义;您可能想将其命名为MAXSENTENCELEN或类似名称。

最后但并非最不重要的一点,alphabets也被错误命名,因为它仅包含一个字母 ,但是实际上您根本不需要它。只需检查字符是否为字母,如果是,则使用它与'A''a'之间的差异作为frequency的索引。要获得加分,请找出避免校验和减法的方法...(提示:ASCII中的大写字母和相应的小写字母的数值仅相差一位)