使用for循环和switch语句编写字符计数器

Tre*_*kkx 1 c for-loop char switch-statement

我一直在尝试编写一个非常简单的字符计数器,它将接收一个字符串并返回每个字符的使用数量.

出于某种原因,无论什么时候计算字母'C'并超出它,它都会破坏,我无法弄清楚为什么.它读取A和B的罚款.

我知道我很可能以一种非常低效的方式做到这一点,但我尝试用更多的循环来做它,它仍然有同样的问题.所以我想我会尽可能简单地做到这一点,直到我发现它是什么造成的.

这是代码:

#include <stdio.h>

int main() {
char str[255];
int chCount[25];

printf("Please enter a string (255 character max): ");
scanf("%[^\n]", str);

for(int x = 0; str[x] != '\0'; x++) {
    if((str[x] >= 65 && str[x] <= 90) || (str[x] >= 97 && str[x] <= 122)) {
        switch(str[x]) {
            case 65:
            case 97:
                chCount[0]++;
            break;

            case 66:
            case 98:
                chCount[1]++;
            break;

            case 67:
            case 99:
                chCount[2]++;
            break;
        }
    }
}

printf("A: %i B: %i C: %i D: %i", chCount[0], chCount[1], chCount[2], chCount[3]);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

显然它没有完成,我不想费心为字母表中的每一个字母写出案例,并在一天结束时遇到同样的问题.

例如,如果我输入"AaBbCc",我将返回"A:2 B:2:C:1244735232"(或其他大数字).

编辑:我非常愚蠢,就像我没有初始化数组一样.将其更改为int chCount [25] = {0}; 修复了一切,我完成了程序而没有使用那个可爱的switch语句(在它之前有一个有效的if语句.是的,我在精神上受到挑战).

Sou*_*osh 5

您的代码不完整,您正在尝试验证尚无代码的输出.

你试图chCount[3]在本质上打印一个未初始化的变量(该数组),因此它会调用未定义的行为.

那说,

  • 而不是使用魔法值,比如65,66,使用字符常量本身一样'A','Z'...等.
  • 您的if陈述是多余的,您已经在案例标签中进行过滤switch.
  • 虽然不是必需的,但你最好有一个default案例来处理超出范围的值.