TTTaeee 2022-09-06 12:08 采纳率: 75%
浏览 48
已结题

关于C语言!!这个问题该怎么解决呢?怎么办呢?

源文件(主函数)
#include <stdlib.h>
#include <stdio.h>
#include "xx.h"

extern Hero heros[100];
int main()
{

Input();
ShowHero();
//InputHero();

}

一个源文件的内容

#include <stdlib.h>
#include <stdio.h>
#include "xx.h"

Hero heros[100] = { //给他留够足够的空间
{1,"hah","m","刺客",579,1.5,"啊啊",{2002,01,11}},
{2,"aa","m","法师",1000,3.5,"啊啊",{2001,04,15}},

//不可以使用单引号!!!

};
int count = 2; //当前的英雄总数
//也可以使用 int len =sizeof(heros)/sizeof(Hero)

Job jobs[] = {
{1,"法师","安琪拉"},
{2,"刺客","李白"},
{3,"战士","亚瑟"},
{4,"射手","虞姬"},
{5,"辅助","蔡文姬"}
};

void Input()
{
//首先录入内容
//第一个录入完毕后,询问是否继续录入 do-while结构

char answer = 'y';
do {
    if (count == 100)
    {
        printf("库存英雄已满 请到商城购买");
    }

    printf("\n----------------当前录入第%d位英雄的信息----------------\n", count + 1);
    printf("英雄的名称是:");
    heros[count].name = (char*)malloc(50);
    scanf("%s", heros[count].name);
    fflush(stdin);

    printf("\n性别是:");
    fflush(stdin);
    scanf("%s", &heros[count].sex);

    printf("\n职业是:");
    fflush(stdin);
    heros[count].job = (char*)malloc(50);
    scanf("%s", &heros[count].job);

    heros[count].hp = 1000;
    printf("\n血量为:%.2f", heros[count].hp);

    heros[count].speed = 0.77;
    printf("\n速度为:%.2f", heros[count].speed);

    //heros[count].ability = "上天,入地";   char *ability; 是一个char型数组 字符指针,可以直接指向一个字符串常量
    printf("\n特殊能力为:");
    heros[count].name = (char*)malloc(50);
    scanf("%s", heros[count].name);
    fflush(stdin);

    heros[count].pubtime.year = 2016;
    heros[count].pubtime.month = 04;
    heros[count].pubtime.day = 28;
    printf("\n上线时间为%d年%d月%d日",
        heros[count].pubtime.year, heros[count].pubtime.month, heros[count].pubtime.day);

    count++;//每次录入完成后 英雄总数加1

    printf("\n是否继续录入?(y/n)");
    //scanf("%s", &answer);//也可以用getch()  
    //getchar()用户按下键后立即触发下面语句 不会再让用户敲回车
    scanf("%s", &answer);
    
} while (answer == 'y' || answer == 'Y');

}

void ShowHero()
{
int i;
printf("\n");
for (i = 0; i < count; i++)
{
printf("%s\t%s\t%d-%d-%d\n", (heros + i)->name, heros[i].job, heros[i].pubtime.year, heros[i].pubtime.month, heros[i].pubtime.day);
}
}

头文件的内容

#ifndef XX_H_INCLUDED
#define XX_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>

#pragma once

//1- 结构体: 英雄 职业 能力 时间

typedef struct _job //typrdef 宏定义一个类型 (和define差不多) 简化结构体的使用 Job.job
{
int id;
char* name;
char* desc; //职业描述
}Job;

typedef struct _ability
{
int id;
char* name;//特殊能力名称
char* intro; //特殊能力说明
}Ability;

typedef struct _pubTime
{
int year;
int month;
int day;
}PubTime;

typedef struct _hero
{
int id;
char* name; //英雄 名称
char* sex;
char * job; //英雄的职业
double hp; //生命值
double speed; //攻击速度
char *ability; //特殊能力
PubTime pubtime; //上线时间
}Hero;

//用来输入英雄的值
//动态录入代码
void InputHero();
void Input();
//用来输出英雄的值
void ShowHero();
#endif //XX_H_INCLUDED

我的问题:printf("\n是否继续录入?(y/n)");
//scanf("%s", &answer);//也可以用getch()
//getchar()用户按下键后立即触发下面语句 不会再让用户敲回车
scanf("%s", &answer);

} while (answer == 'y' || answer == 'Y');

到这个语句的时候 scanf如果输入y可以继续执行,可是一旦输入了n就会报错。
如果把scanf换成getchar 没有输入的过程 直接跳到了ShowHero()函数。

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-09-06 13:55
    关注

    scanf("%s", &answer); 定义的 answer是字符变量,所以应该改为: scanf(" %c", &answer); 不是用 %s ,同时注意” %c“ 引号里%c前面留一空格。
    整体修改如下,修改处见注释,供参考:

    #include <stdlib.h>
    #include <stdio.h>
    //#include "xx.h"
    
    //1- 结构体: 英雄 职业 能力 时间
    typedef struct _job //typrdef 宏定义一个类型 (和define差不多) 简化结构体的使用 Job.job
    {
        int id;
        char* name;
        char* desc; //职业描述
    }Job;
    
    typedef struct _ability
    {
        int id;
        char* name;//特殊能力名称
        char* intro; //特殊能力说明
    }Ability;
    
    typedef struct _pubTime
    {
        int year;
        int month;
        int day;
    }PubTime;
    
    typedef struct _hero
    {
        int id;
        char* name; //英雄 名称
        char* sex;
        char* job; //英雄的职业
        double hp; //生命值
        double speed; //攻击速度
        char* ability; //特殊能力
        PubTime pubtime; //上线时间
    }Hero;
    extern Hero heros[100];
    int count = 2; //当前的英雄总数
    
    void InputHero();
    void ShowHero();  // 这里 漏了ShowHero()函数声明  修改
    //void Input();
    
    Hero heros[100] = { //给他留够足够的空间
    {1,"hah","m","刺客",579,1.5,"啊啊",{2002,01,11}},
    {2,"aa","m","法师",1000,3.5,"啊啊",{2001,04,15}},
    //不可以使用单引号!!!
    };
    
    //也可以使用 int len =sizeof(heros)/sizeof(Hero)
    
    Job jobs[] = {
    {1,"法师","安琪拉"},
    {2,"刺客","李白"},
    {3,"战士","亚瑟"},
    {4,"射手","虞姬"},
    {5,"辅助","蔡文姬"}
    };
    int main()
    {
        InputHero();
        ShowHero();
        //InputHero();
    }
    void InputHero()
    {
        //首先录入内容
        //第一个录入完毕后,询问是否继续录入 do-while结构
        char answer = 'y';
        do {
            if (count == 100)
            {
                printf("库存英雄已满 请到商城购买");
            }
            printf("\n----------------当前录入第%d位英雄的信息----------------\n", count + 1);
            printf("英雄的名称是:");
            heros[count].name = (char*)malloc(50);
            scanf("%s", heros[count].name);
            fflush(stdin);
    
            printf("\n性别是:");
            fflush(stdin);
            heros[count].sex = (char*)malloc(4); //修改
            scanf("%s", heros[count].sex);
            //scanf("%s", &heros[count].sex);    //修改
    
            printf("\n职业是:");
            fflush(stdin);
            heros[count].job = (char*)malloc(50);
            scanf("%s", heros[count].job);
            //scanf("%s", &heros[count].job);  //修改
    
            heros[count].hp = 1000;
            printf("\n血量为:%.2f", heros[count].hp);
    
            heros[count].speed = 0.77;
            printf("\n速度为:%.2f", heros[count].speed);
    
            //heros[count].ability = "上天,入地";   char *ability; 是一个char型数组 字符指针,可以直接指向一个字符串常量
            printf("\n特殊能力为:");
            heros[count].ability = (char*)malloc(50);
            //heros[count].name = (char*)malloc(50);  //修改
            scanf("%s", heros[count].ability);   
            //scanf("%s", heros[count].name);         //修改
            fflush(stdin);
    
            heros[count].pubtime.year = 2016;
            heros[count].pubtime.month = 04;
            heros[count].pubtime.day = 28;
            printf("\n上线时间为%d年%d月%d日",
                heros[count].pubtime.year, heros[count].pubtime.month, heros[count].pubtime.day);
    
            count++;//每次录入完成后 英雄总数加1
    
            printf("\n是否继续录入?(y/n)");
            //scanf("%s", &answer);//也可以用getch()  
            //getchar()用户按下键后立即触发下面语句 不会再让用户敲回车
            scanf(" %c", &answer);     //修改
            //scanf("%s", &answer);
    
        } while (answer == 'y' || answer == 'Y');
    }
    void ShowHero()
    {
        int i;
        printf("\n");
        for (i = 0; i < count; i++)
        {
            printf("%s\t%s\t%d-%d-%d\n", (heros + i)->name, heros[i].job, 
                heros[i].pubtime.year, heros[i].pubtime.month, heros[i].pubtime.day);
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 9月15日
  • 已采纳回答 9月7日
  • 修改了问题 9月6日
  • 修改了问题 9月6日
  • 展开全部

悬赏问题

  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染