鱼C论坛

 找回密码
 立即注册
查看: 2088|回复: 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;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

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

下面是修改后的代码:

  1. #include <stdio.h>

  2. int main() {
  3.     int n, m;
  4.     scanf("%d", &n);
  5.     char a[n + 1];
  6.     scanf("%s", a);
  7.     int eng = 0, spa = 0, num = 0, oth = 0;
  8.     for (m = 0; m < n; m++) {
  9.         switch (a[m]) {
  10.             case ' ':
  11.             case '\n':
  12.                 spa = spa + 1;
  13.                 break;
  14.             case 'A' ... 'Z':
  15.             case 'a' ... 'z':
  16.                 eng = eng + 1;
  17.                 break;
  18.             case '0' ... '9':
  19.                 num = num + 1;
  20.                 break;
  21.             default:
  22.                 oth = oth + 1;
  23.         }
  24.     }
  25.     printf("%d %d %d %d", eng, spa, num, oth);
  26.     return 0;
  27. }
复制代码


这样修改后,你的代码应该可以正确统计各种字符的个数了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

下面是修改后的代码:
  1. #include <stdio.h>
  2. int main() {
  3.     int n, m;
  4.     scanf("%d", &n);
  5.     char a[n + 1];
  6.     scanf("%s", a);
  7.     int eng = 0, spa = 0, num = 0, oth = 0;
  8.     for (m = 1; m <= n; m++) {
  9.         char c = getchar();
  10.         switch (c) {
  11.             case ' ':
  12.             case '\r':
  13.                 spa++;
  14.                 break;
  15.             case 'A'...'Z':
  16.             case 'a'...'z':
  17.                 eng++;
  18.                 break;
  19.             case '0'...'9':
  20.                 num++;
  21.                 break;
  22.             default:
  23.                 oth++;
  24.                 break;
  25.         }
  26.     }
  27.     printf("%d %d %d %d\n", eng, spa, num, oth);
  28.     return 0;
  29. }
复制代码

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

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://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
请按任意键继续. . .



小甲鱼最新课程 -> https://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
请按任意键继续. . .

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 13:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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