鱼C论坛

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

[已解决]新手求助,关于switch语句和字符串的问题

[复制链接]
发表于 2023-6-22 11:04:02 | 显示全部楼层 |阅读模式

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

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

x
新手求助,现在跟着小甲鱼的课程学到S1E12:switch语句和分支嵌套,这节课了。
现在遇到一个问题
  1. #include <stdio.h>
  2. //程序说明:90分及以上A,80~90为B,70~80为C,60~70为D,低于60分为E。此程序是反过来的 。
  3. int main()
  4. {
  5.         char name[0];
  6.         char score;
  7.         char a,b;
  8.         int i;
  9.         printf("请输入你的名字:\n");
  10.         scanf("%s",&name);
  11.         getchar();
  12.         printf("请输入你的评级:\n");
  13.         scanf("%c",&score);
  14.         printf("%s同学,",name);
  15.         switch (score)
  16.         {
  17.                 case 'A': printf("你的成绩在90分及以上!\n");i = 1;break;
  18.                 case 'B': printf("你的成绩在[80,90)\n");i = 1;break;
  19.                 case 'C': printf("你的成绩在[70,80)\n");i = 1;break;
  20.                 case 'D': printf("你的成绩在[60,70)\n");i = 0;break;       
  21.                 case 'E': printf("你的成绩在[0,60)\n");i = 0;break;
  22.                 default : printf("你输入的是%c,你这是乱输的吧:(\n",score);break;
  23.         }
  24.         //接下来是一个分支嵌套结构
  25.         if(i==1)
  26.         {
  27.                 printf("%s同学,你的成绩这么好,能否采访你一下?('y'/'n')",name);
  28.         }
  29.         else
  30.         {
  31.                 printf("%s同学,你的成绩这么差,能否采访你一下?('y'/'n')",name);
  32.         }
  33.         getchar();
  34.         scanf("%c",&a);
  35.         if(a == 'Y' || a == 'y')
  36.         {
  37.                 getchar();
  38.                 printf("很好,请问你是不是帅哥?(y/n)");
  39.                 scanf("%c",&b);
  40.                 if(b =='Y' || b == 'y')
  41.                 {
  42.                         printf("好的,%s同学成绩好的原因是:他是帅哥。",name);       
  43.                 }
  44.                 else
  45.                 {
  46.                         printf("好的,%s同学成绩好的原因是:他不是帅哥。",name);
  47.                 }
  48.         }
  49.         else
  50.         {
  51.                 printf("那就算了;)");
  52.         }
  53.        
  54.         return 0;
  55. }
复制代码



运行后的结果是这样的:

请输入你的名字:
FishC
请输入你的评级:
A
FishC同学,你的成绩在90分及以上!
同学,你的成绩这么好,能否采访你一下?('y'/'n')y
很好,请问你是不是帅哥?(y/n)y
好的,同学成绩好的原因是:他是帅哥。
--------------------------------
Process exited after 12.68 seconds with return value 0
请按任意键继续. . .



为什么用了switch后,name变量就变成了。
最佳答案
2023-6-22 11:06:42
你的代码中有个小问题,就在定义名字的数组长度上。你定义  char name[0];  的时候,你给  name  分配的空间是0,所以无法存储用户输入的名字。这会导致后续的错误,因为没有为名字预留足够的空间,所以当你试图访问它时,会得到意料之外的结果,也就是你现在遇到的问题。

解决方法很简单,只需要给  name  分配足够的空间,比如  char name[100]; ,这样就可以存储最多99个字符的名字(最后一个位置留给字符串结束符'\0')。

另外,当你使用scanf函数输入字符串时,不需要在变量前加 "&"。字符串变量的名字已经是一个指向该字符串第一个字符的指针,所以你应该改写为  scanf("%s", name);

这是修改后的代码:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char name[100];
  5.     char score;
  6.     char a, b;
  7.     int i;

  8.     printf("请输入你的名字:\n");
  9.     scanf("%s", name);

  10.     getchar();

  11.     printf("请输入你的评级:\n");
  12.     scanf("%c", &score);

  13.     printf("%s同学,", name);
  14.     switch (score)
  15.     {
  16.         case 'A': printf("你的成绩在90分及以上!\n");i = 1;break;
  17.         case 'B': printf("你的成绩在[80,90)\n");i = 1;break;
  18.         case 'C': printf("你的成绩在[70,80)\n");i = 1;break;
  19.         case 'D': printf("你的成绩在[60,70)\n");i = 0;break;      
  20.         case 'E': printf("你的成绩在[0,60)\n");i = 0;break;
  21.         default : printf("你输入的是%c,你这是乱输的吧:(\n",score);break;
  22.     }

  23.     if(i==1)
  24.     {
  25.         printf("%s同学,你的成绩这么好,能否采访你一下?('y'/'n')",name);
  26.     }
  27.     else
  28.     {
  29.         printf("%s同学,你的成绩这么差,能否采访你一下?('y'/'n')",name);
  30.     }

  31.     getchar();
  32.     scanf("%c",&a);

  33.     if(a == 'Y' || a == 'y')
  34.     {
  35.         getchar();
  36.         printf("很好,请问你是不是帅哥?(y/n)");
  37.         scanf("%c",&b);

  38.         if(b =='Y' || b == 'y')
  39.         {
  40.             printf("好的,%s同学成绩好的原因是:他是帅哥。",name);      
  41.         }
  42.         else
  43.         {
  44.             printf("好的,%s同学成绩好的原因是:他不是帅哥。",name);
  45.         }
  46.     }
  47.     else
  48.     {
  49.         printf("那就算了;)");
  50.     }
  51.    
  52.     return 0;
  53. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-22 11:06:42 | 显示全部楼层    本楼为最佳答案   
你的代码中有个小问题,就在定义名字的数组长度上。你定义  char name[0];  的时候,你给  name  分配的空间是0,所以无法存储用户输入的名字。这会导致后续的错误,因为没有为名字预留足够的空间,所以当你试图访问它时,会得到意料之外的结果,也就是你现在遇到的问题。

解决方法很简单,只需要给  name  分配足够的空间,比如  char name[100]; ,这样就可以存储最多99个字符的名字(最后一个位置留给字符串结束符'\0')。

另外,当你使用scanf函数输入字符串时,不需要在变量前加 "&"。字符串变量的名字已经是一个指向该字符串第一个字符的指针,所以你应该改写为  scanf("%s", name);

这是修改后的代码:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char name[100];
  5.     char score;
  6.     char a, b;
  7.     int i;

  8.     printf("请输入你的名字:\n");
  9.     scanf("%s", name);

  10.     getchar();

  11.     printf("请输入你的评级:\n");
  12.     scanf("%c", &score);

  13.     printf("%s同学,", name);
  14.     switch (score)
  15.     {
  16.         case 'A': printf("你的成绩在90分及以上!\n");i = 1;break;
  17.         case 'B': printf("你的成绩在[80,90)\n");i = 1;break;
  18.         case 'C': printf("你的成绩在[70,80)\n");i = 1;break;
  19.         case 'D': printf("你的成绩在[60,70)\n");i = 0;break;      
  20.         case 'E': printf("你的成绩在[0,60)\n");i = 0;break;
  21.         default : printf("你输入的是%c,你这是乱输的吧:(\n",score);break;
  22.     }

  23.     if(i==1)
  24.     {
  25.         printf("%s同学,你的成绩这么好,能否采访你一下?('y'/'n')",name);
  26.     }
  27.     else
  28.     {
  29.         printf("%s同学,你的成绩这么差,能否采访你一下?('y'/'n')",name);
  30.     }

  31.     getchar();
  32.     scanf("%c",&a);

  33.     if(a == 'Y' || a == 'y')
  34.     {
  35.         getchar();
  36.         printf("很好,请问你是不是帅哥?(y/n)");
  37.         scanf("%c",&b);

  38.         if(b =='Y' || b == 'y')
  39.         {
  40.             printf("好的,%s同学成绩好的原因是:他是帅哥。",name);      
  41.         }
  42.         else
  43.         {
  44.             printf("好的,%s同学成绩好的原因是:他不是帅哥。",name);
  45.         }
  46.     }
  47.     else
  48.     {
  49.         printf("那就算了;)");
  50.     }
  51.    
  52.     return 0;
  53. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-6-22 11:27:44 | 显示全部楼层
isdkz 发表于 2023-6-22 11:06
你的代码中有个小问题,就在定义名字的数组长度上。你定义  char name[0];  的时候,你给  name  分配的空 ...

谢谢大佬指点,修改后果然成功了,目前还没有学到”指针“,所以不太理解您最后一句话的意思。
是用scanf函数赋值给数组(我把这个理解成字符串了,因为听小甲鱼说C语言没有专门的字符串类型,这里就有点混乱)就不加”&“这个符号吗?因为我看到其他的scanf里您没有把”&“去掉。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-22 12:00:46 | 显示全部楼层
BaysideLizard 发表于 2023-6-22 11:27
谢谢大佬指点,修改后果然成功了,目前还没有学到”指针“,所以不太理解您最后一句话的意思。
是用scan ...

因为数组名就是数组第一个元素的地址,所以在使用 scanf 的时候数组就不需要加取址符了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-6-22 12:53:03 | 显示全部楼层
isdkz 发表于 2023-6-22 12:00
因为数组名就是数组第一个元素的地址,所以在使用 scanf 的时候数组就不需要加取址符了

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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