ylc77 发表于 2023-11-2 11:15:13

为啥switch有问题

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

int main() {
        int n, m;
        scanf ("%d", &n);
        char a;
        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;
}

isdkz 发表于 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;
    scanf("%s", a);
    int eng = 0, spa = 0, num = 0, oth = 0;
    for (m = 0; m < n; m++) {
      switch (a) {
            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;
}


这样修改后,你的代码应该可以正确统计各种字符的个数了。

Mike_python小 发表于 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;
    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;
}


在修改代码时,建议注意代码的格式和排版,以方便阅读和维护。同时,应该多进行代码测试和调试,以确保代码的正确性。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

ylc77 发表于 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
请按任意键继续. . .



ylc77 发表于 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
请按任意键继续. . .

页: [1]
查看完整版本: 为啥switch有问题