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

Posted

技术标签:

【中文标题】使用 for 循环和 switch 语句编写字符计数器【英文标题】:Writing a character counter using for loop & switch statement 【发布时间】:2017-07-17 06:51:30 【问题描述】:

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

出于某种原因,每当计算字母“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;

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

例如,如果我输入“AaBbCc”,则会返回“A: 2 B: 2: C: 1244735232”(或另一个巨大的数字)。

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

【问题讨论】:

数组未初始化。初始化它:int chCount[25] = 0;. 为什么在switch语句之前有一个if语句? 另外,您可以根据正在查看的字母计算索引,而不是使用巨大的 switch 语句.. 【参考方案1】:

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

您正在尝试打印chCount[3],它本质上是(该数组的)未初始化变量,因此它调用undefined behavior。

也就是说,

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

【讨论】:

以上是关于使用 for 循环和 switch 语句编写字符计数器的主要内容,如果未能解决你的问题,请参考以下文章

for循环 switch foreach用法合区别

c++中for循环和switch语句哪个更高效

Java基础第4天+switch语句for,while,do...while循环语句break,return,continue控制跳转语句

谁能用c语言中的for语句,编写个从1加到100的程序

有两个循环,他们是嵌套关系,在内循环中使用break将终止哪一个循环?

Java零基础小白入门教程第三次课switch&循环