BaysideLizard 发表于 2023-6-22 11:04:02

新手求助,关于switch语句和字符串的问题

新手求助,现在跟着小甲鱼的课程学到S1E12:switch语句和分支嵌套,这节课了。
现在遇到一个问题
#include <stdio.h>
//程序说明:90分及以上A,80~90为B,70~80为C,60~70为D,低于60分为E。此程序是反过来的 。
int main()
{
        char name;
        char score;
        char a,b;
        int i;
        printf("请输入你的名字:\n");
        scanf("%s",&name);
        getchar();
        printf("请输入你的评级:\n");
        scanf("%c",&score);
        printf("%s同学,",name);
        switch (score)
        {
                case 'A': printf("你的成绩在90分及以上!\n");i = 1;break;
                case 'B': printf("你的成绩在[80,90)\n");i = 1;break;
                case 'C': printf("你的成绩在[70,80)\n");i = 1;break;
                case 'D': printf("你的成绩在[60,70)\n");i = 0;break;       
                case 'E': printf("你的成绩在[0,60)\n");i = 0;break;
                default : printf("你输入的是%c,你这是乱输的吧:(\n",score);break;
        }
        //接下来是一个分支嵌套结构
        if(i==1)
        {
                printf("%s同学,你的成绩这么好,能否采访你一下?('y'/'n')",name);
        }
        else
        {
                printf("%s同学,你的成绩这么差,能否采访你一下?('y'/'n')",name);
        }
        getchar();
        scanf("%c",&a);
        if(a == 'Y' || a == 'y')
        {
                getchar();
                printf("很好,请问你是不是帅哥?(y/n)");
                scanf("%c",&b);
                if(b =='Y' || b == 'y')
                {
                        printf("好的,%s同学成绩好的原因是:他是帅哥。",name);       
                }
                else
                {
                        printf("好的,%s同学成绩好的原因是:他不是帅哥。",name);
                }
        }
        else
        {
                printf("那就算了;)");
        }
       
        return 0;
}


运行后的结果是这样的:

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



为什么用了switch后,name变量就变成了。{:5_100:}

isdkz 发表于 2023-6-22 11:06:42

你的代码中有个小问题,就在定义名字的数组长度上。你定义char name;的时候,你给name分配的空间是0,所以无法存储用户输入的名字。这会导致后续的错误,因为没有为名字预留足够的空间,所以当你试图访问它时,会得到意料之外的结果,也就是你现在遇到的问题。

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

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

这是修改后的代码:

#include <stdio.h>

int main()
{
    char name;
    char score;
    char a, b;
    int i;

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

    getchar();

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

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

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

    getchar();
    scanf("%c",&a);

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

      if(b =='Y' || b == 'y')
      {
            printf("好的,%s同学成绩好的原因是:他是帅哥。",name);      
      }
      else
      {
            printf("好的,%s同学成绩好的原因是:他不是帅哥。",name);
      }
    }
    else
    {
      printf("那就算了;)");
    }
   
    return 0;
}

BaysideLizard 发表于 2023-6-22 11:27:44

isdkz 发表于 2023-6-22 11:06
你的代码中有个小问题,就在定义名字的数组长度上。你定义char name;的时候,你给name分配的空 ...

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

isdkz 发表于 2023-6-22 12:00:46

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

因为数组名就是数组第一个元素的地址,所以在使用 scanf 的时候数组就不需要加取址符了

BaysideLizard 发表于 2023-6-22 12:53:03

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

感谢!{:5_110:}
页: [1]
查看完整版本: 新手求助,关于switch语句和字符串的问题