鱼C论坛

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

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

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

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

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

x
新手求助,现在跟着小甲鱼的课程学到S1E12:switch语句和分支嵌套,这节课了。
现在遇到一个问题
#include <stdio.h>
//程序说明:90分及以上A,80~90为B,70~80为C,60~70为D,低于60分为E。此程序是反过来的 。 
int main()
{
        char name[0];
        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变量就变成了。
最佳答案
2023-6-22 11:06:42
你的代码中有个小问题,就在定义名字的数组长度上。你定义  char name[0];  的时候,你给  name  分配的空间是0,所以无法存储用户输入的名字。这会导致后续的错误,因为没有为名字预留足够的空间,所以当你试图访问它时,会得到意料之外的结果,也就是你现在遇到的问题。

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

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

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

int main()
{
    char name[100];
    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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

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

int main()
{
    char name[100];
    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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

使用道具 举报

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

因为数组名就是数组第一个元素的地址,所以在使用 scanf 的时候数组就不需要加取址符了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 13:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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