免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1184 | 回复: 3
打印 上一主题 下一主题

[C] 这个程序运行为什么崩溃 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-09-02 00:02 |只看该作者 |倒序浏览
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define MAX_NAME_LENGTH 20
  5. #define MAX_STUDENT_NUMBER 10
  6. #define MAX_CLASS_NUMBER 10

  7. typedef struct student
  8. {
  9.         char name[MAX_NAME_LENGTH];
  10.         unsigned short int age;
  11.         unsigned short int class_number;
  12.         unsigned short int chinese_scores;
  13.         unsigned short int math_scores;
  14.         unsigned short int english_scores;
  15.        
  16. }Student;

  17. typedef struct stu_class
  18. {
  19.         Student students[MAX_STUDENT_NUMBER];
  20.         unsigned short int class_number;
  21.        
  22. }Stu_Class;

  23. typedef struct class_system
  24. {
  25.         Stu_Class stu_class[MAX_CLASS_NUMBER];
  26.         //unsigned short int class_sum;
  27. }Class_System;

  28. Class_System class_system;

  29. void Init_Class_System()
  30. {
  31.         memset(&class_system,0,sizeof(Class_System));
  32.         printf("class_system initialization success\n");
  33. }

  34. void Add_A_Student_To_Class_System()
  35. {
  36.         char name[MAX_NAME_LENGTH] ={'\0'};
  37.         unsigned short int age;
  38.         unsigned short int class_number;
  39.         unsigned short int chinese_scores;
  40.         unsigned short int math_scores;
  41.         unsigned short int english_scores;
  42.         unsigned short int number;
  43.         printf("please input name,age,class_number(1-9),chinese score,math score, english score and the number(1-9)\n");

  44.         scanf("%s,%d,%d,%d,%d,%d,%d\n",name,&age,&class_number,
  45.                 &chinese_scores,&math_scores,&english_scores,&number);

  46.         strcpy(class_system.stu_class[class_number].students[number].name,name);
  47.         class_system.stu_class[class_number].students[number].age = age;
  48.         class_system.stu_class[class_number].students[number].class_number = class_number;
  49.         class_system.stu_class[class_number].students[number].chinese_scores = chinese_scores;
  50.         class_system.stu_class[class_number].students[number].math_scores = math_scores;
  51.         class_system.stu_class[class_number].students[number].english_scores = english_scores;

  52.         printf("Add student info success!\n");
  53. }

  54. int main()
  55. {
  56.         int i;
  57.         Init_Class_System();
  58.         for(i = 0; i<10;i++)
  59.         {
  60.                 Add_A_Student_To_Class_System();
  61.         }

  62.         return 0;
  63. }
复制代码


微信截图_20160901235748.png (7.9 KB, 下载次数: 24)

微信截图_20160901235748.png

论坛徽章:
0
2 [报告]
发表于 2016-09-02 06:40 |只看该作者
因为scanf函数输入错误,导致其他值没有被赋值。然后访问数组成员时越界导致的segment fault。
修改一下scanf就好了。scanf输入%s时需要额外注意,他只能放在所有数字输入之后,或者单独输入一行用于保存文本(name)。%s在最开头表示整行输入数据都给了name,导致其余变量没有正确的值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NAME_LENGTH 20
#define MAX_STUDENT_NUMBER 10
#define MAX_CLASS_NUMBER 10

typedef struct student
{
        char name[MAX_NAME_LENGTH];
        unsigned short int age;
        unsigned short int class_number;
        unsigned short int chinese_scores;
        unsigned short int math_scores;
        unsigned short int english_scores;

}Student;

typedef struct stu_class
{
        Student students[MAX_STUDENT_NUMBER];
        unsigned short int class_number;

}Stu_Class;

typedef struct class_system
{
        Stu_Class stu_class[MAX_CLASS_NUMBER];
        //unsigned short int class_sum;
}Class_System;

Class_System class_system;

void Init_Class_System()
{
        memset(&class_system,0,sizeof(Class_System));
        printf("class_system initialization success\n");
}

void Add_A_Student_To_Class_System()
{
        char name[MAX_NAME_LENGTH] ={'\0'};
        unsigned short int age = 0;
        unsigned short int class_number = 0;
        unsigned short int chinese_scores = 0;
        unsigned short int math_scores = 0;
        unsigned short int english_scores = 0;
        unsigned short int number = 0;
        //printf("please input name,age,class_number(1-9),chinese score,math score, english score and the number(1-9)\n");
        printf("input class_number(1-9), stu number(1-9),age, chinese score, math score, english score and name.\n");
        //scanf("%s,%h,%h,%h,%h,%h,%h",name,&age,&class_number,
        //        &chinese_scores,&math_scores,&english_scores,&number);
        scanf("%hd,%hd,%hd,%hd,%hd,%hd,%s", &class_number, &number, &age, &chinese_scores, &math_scores, &english_scores, name);
        printf("class_nu:%d,number:%d, age:%d,chinese:%d,math:%d,english:%d,name:%s.\n",
                              class_number, number, age, chinese_scores, math_scores, english_scores, name);
        //input format: 1,2,3,4,5,6,tom
        strcpy(class_system.stu_class[class_number].students[number].name,name);

        class_system.stu_class[class_number].students[number].age = age;
        class_system.stu_class[class_number].students[number].class_number = class_number;
        class_system.stu_class[class_number].students[number].chinese_scores = chinese_scores;
        class_system.stu_class[class_number].students[number].math_scores = math_scores;
        class_system.stu_class[class_number].students[number].english_scores = english_scores;

        printf("Add student info success!\n");
}

int main()
{
        int i;
        Init_Class_System();
        for(i = 0; i<10;i++)
        {
                Add_A_Student_To_Class_System();
        }

        return 0;
}

论坛徽章:
0
3 [报告]
发表于 2016-09-03 00:33 |只看该作者
回复 2# 451006071
谢谢啊,真的是这样,我自己调了很久都没想明白问题在哪儿,还以为是初始化的问题



论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
4 [报告]
发表于 2016-09-03 11:42 |只看该作者
segment fault


一般是没有写过代码的人才会问,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP