鱼C论坛

 找回密码
 立即注册
查看: 1453|回复: 4

为啥switch有问题

[复制链接]
发表于 2023-11-2 11:15:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:9. 统计字符
输入1个正整数n,在输入n个字符,分别统计其中英文字母、空格或回车、数字字符和其他字符的个数。
我这次想用switch试试,学学用法,所以没用if...else,
我写的代码如下:
#include <stdio.h>

int main() {
        int n, m;
        scanf ("%d", &n);
        char a[n + 1];
        scanf("%s", &a);
        int eng = 0, spa = 0, num = 0, oth = 0;
        for (m = 1; m <= n; m++) {
                switch (getchar() != '\0') {
                        case 32:
                                spa = spa + 1;
                                break;
                        case 13:
                                spa = spa + 1;
                                break;
                        case 65 ... 90:
                                eng = eng + 1;
                                break;
                        case 97 ... 122:
                                eng = eng + 1;
                                break;
                        case 48 ... 57:
                                num = num + 1;
                                break;
                        default:
                                oth = oth + 1;
                }
        }
        printf("%d%d%d%d", eng, spa, num, oth);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-2 11:15:27 | 显示全部楼层
你的代码有几个问题导致 switch 语句无法正常工作:

1. switch 语句的表达式应该是一个整数类型,而你使用的是  getchar() != '\0' ,这个表达式返回的是一个布尔类型(true 或 false),无法匹配 case 中的整数值。你需要修改为一个整数类型的表达式。

2. case 后面的值应该是整数常量,而你使用的是字符常量。你需要使用字符的 ASCII 值来匹配。

3. 你在 for 循环中使用了  getchar() ,这会导致每次循环时都会读取一个字符,而不是读取输入的字符数组。你应该使用数组  a  中的字符进行判断。

下面是修改后的代码:
#include <stdio.h>

int main() {
    int n, m;
    scanf("%d", &n);
    char a[n + 1];
    scanf("%s", a);
    int eng = 0, spa = 0, num = 0, oth = 0;
    for (m = 0; m < n; m++) {
        switch (a[m]) {
            case ' ':
            case '\n':
                spa = spa + 1;
                break;
            case 'A' ... 'Z':
            case 'a' ... 'z':
                eng = eng + 1;
                break;
            case '0' ... '9':
                num = num + 1;
                break;
            default:
                oth = oth + 1;
        }
    }
    printf("%d %d %d %d", eng, spa, num, oth);
    return 0;
}

这样修改后,你的代码应该可以正确统计各种字符的个数了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-2 11:16:05 | 显示全部楼层
在这个代码中,有以下几个问题:

1. 在 switch 语句中,使用 getchar() 函数获取字符,但是没有将获取的字符与具体的值进行比较。实际上,应该将 getchar() 函数的返回值赋值给一个变量,并将变量与具体的值进行比较。
2. 在 scanf("%s", &a) 中,&a 应该改为 a。因为 a 已经是一个指针了,不需要再取地址。
3. 在最后的输出中,应该使用空格分隔数字,而不是连接起来。

下面是修改后的代码:
#include <stdio.h>int main() {    int n, m;    scanf("%d", &n);    char a[n + 1];    scanf("%s", a);    int eng = 0, spa = 0, num = 0, oth = 0;    for (m = 1; m <= n; m++) {        char c = getchar();        switch (c) {            case ' ':            case '\r':                spa++;                break;            case 'A'...'Z':            case 'a'...'z':                eng++;                break;            case '0'...'9':                num++;                break;            default:                oth++;                break;        }    }    printf("%d %d %d %d\n", eng, spa, num, oth);    return 0;}
在修改代码时,建议注意代码的格式和排版,以方便阅读和维护。同时,应该多进行代码测试和调试,以确保代码的正确性。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-2 12:25:38 | 显示全部楼层
isdkz 发表于 2023-11-2 11:15
你的代码有几个问题导致 switch 语句无法正常工作:

1. switch 语句的表达式应该是一个整数类型,而你使 ...

结果不对,运行结果(前两行输入,第三行是输出):
13
I love FishC!
2 0 0 11
--------------------------------
Process exited after 8.672 seconds with return value 0
请按任意键继续. . .



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-2 12:33:24 | 显示全部楼层
Mike_python小 发表于 2023-11-2 11:16
在这个代码中,有以下几个问题:

1. 在 switch 语句中,使用 getchar() 函数获取字符,但是没有将获取的字 ...

还是有问题欸...不会是算法就有问题吧TAT
尝试如下:

5
1 32!
0 2 2 1
--------------------------------
Process exited after 14.09 seconds with return value 0
请按任意键继续. . .



13
I love FishC!
9 3 0 1
--------------------------------
Process exited after 8.658 seconds with return value 0
请按任意键继续. . .

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 15:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表