鱼C论坛

 找回密码
 立即注册
查看: 4342|回复: 12

一个简单的结构体嵌套输入

[复制链接]
发表于 2013-6-22 18:17:18 | 显示全部楼层 |阅读模式
1鱼币
QQ截图20130622181308.png
嵌套结构体如上,,

QQ截图20130622181334.png
这是我未能达到目的的输入语句,我的想法是将课程循环输入,就是说将M跟N的值改动,可以输入的课程数目就要跟着懂。

如上,如果进行分开输入,但是实际上,当我去输入包含的那个结构体数组实,外层的结构体,未有实体也就无法进行循环输入。

请勿超越c语言的知识,比如用C++解决此类问题,不是我想要的结果。。。。。   

过于简单的点一下的答案就不必回答了。

望能了解。

最佳答案

查看完整内容

学习学习,写了一下代码,你看看。 希望对你有帮助,支持支持{:7_155:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-22 18:17:19 | 显示全部楼层
本帖最后由 fanki 于 2013-6-23 14:43 编辑

复制代码



  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>

  4. #define MAX 20

  5. typedef struct score
  6. {
  7.         char score_name[MAX];
  8.         double stu_score;
  9. } score;

  10. typedef struct stu
  11. {
  12.         char name[MAX];
  13.         char num[MAX];
  14.         struct score *score_stu;
  15.         char passwd[MAX];
  16. } stu;


  17. //用于初始化科目的
  18. void InitStuSub( stu* group, int stNum, int subNum );
  19. //用于出入名称的 (你可以加上输入其他信息)
  20. void InputStName( stu* group, int stNum );
  21. //用于显示所有资料信息的 (我只显示了名字和成绩,其他你可以加上)
  22. void ShowAllStuInfo( stu* group, int stNum, int subNum );
  23. //用于释放已经申请的空间的。
  24. void deleteInfo( stu* group, int stNum );


  25. //初始化科目的
  26. void InitStuSub( stu* group, int stNum, int subNum )
  27. {
  28.         //输入科目名的一片空间
  29.         char* subname = ( char * )malloc( MAX * subNum );
  30.         //找一个指针控制位置
  31.         char* name = subname;
  32.         int i = 0, j = 0;
  33.         //循环输入科目名
  34.         for ( i = 0; i < subNum; i++ )
  35.         {
  36.                 printf( "请输入第%d科名称:", i + 1 );
  37.                 //输入前先清空输入缓冲区
  38.                 fflush( stdin );
  39.                 scanf( "%s", name );
  40.                 //指针向后移动一个名称的位置
  41.                 name = name + MAX;
  42.         }
  43.         //循环把科目的名字放到每个同学的结构体里面,并申请空间给它,成绩我改了用double型,成绩初始为0
  44.         //i控制第几个学生,j控制第几个科目
  45.         for ( i = 0; i < stNum; i++ )
  46.         {
  47.                 name = subname;
  48.                 group[i].score_stu = ( score* )malloc( sizeof( score ) * subNum );
  49.                 for ( j = 0; j < subNum; j++ )
  50.                 {
  51.                         //把成绩名字复制过去
  52.                         strncpy( group[i].score_stu[j].score_name, name, MAX );
  53.                         name = name + MAX;
  54.                         group[i].score_stu->stu_score = 0;
  55.                 }
  56.         }
  57.         //这个subname只是用来保存科目名字的,用完就释放了。
  58.         free( subname );
  59. }

  60. //显示所有信息(只是普通的打印)
  61. void ShowAllStuInfo( stu* group, int stNum, int subNum )
  62. {
  63.         int i = 0, j = 0;
  64.         //i控制第几个学生,j控制第几个科目
  65.         for ( i = 0; i < stNum; i++ )
  66.         {
  67.                 printf( "第%d个学生的姓名是:%s", i + 1, group[i].name );
  68.                 for ( j = 0; j < subNum; j++ )
  69.                 {
  70.                         printf( "第%d科%s成绩是:%g\n", j + 1, group[i].score_stu[j].score_name, group[i].score_stu->stu_score );
  71.                 }
  72.         }
  73. }

  74. //输入名字
  75. void InputStName( stu* group, int stNum )
  76. {
  77.         int i = 0;
  78.         for( i = 0; i < stNum; i++ )
  79.         {
  80.                 printf( "请输入第%d个学生姓名:", i + 1 );
  81.                 //输入前清空输入缓冲区,习惯,哈哈
  82.                 fflush( stdin );
  83.                 fgets( group[i].name, MAX, stdin );
  84.         }
  85. }

  86. //释放空间不能只free group,因为结构体里面申请的空间还没有释放
  87. void deleteInfo( stu* group, int stNum )
  88. {
  89.         int i = 0;
  90.         for ( i = 0; i < stNum; i++ )
  91.         {
  92.                 free( group[i].score_stu );
  93.         }
  94.         free( group );
  95. }

  96. //主函数
  97. int main(int argc, char *argv[])
  98. {
  99.         //输入学生数
  100.         int stNum = 0;
  101.         printf( "请输入学生数:" );
  102.         while( !scanf( "%d", &stNum ) ){
  103.                 printf( "输入错误,请重新输入" );
  104.                 fflush( stdin );
  105.         }
  106.         stu* stugroup = ( stu* )malloc( sizeof(stu) * stNum );

  107.         //输入科目数
  108.         int subNum = 0;
  109.         printf( "请输科目数:" );
  110.         while( !scanf( "%d", &subNum ) ){
  111.                 printf( "输入错误,请重新输入" );
  112.                 fflush( stdin );
  113.         }

  114.         //用于初始化科目的
  115.         InitStuSub( stugroup, stNum, subNum );
  116.         //用于出入名称的 (你可以加上输入其他信息)
  117.         InputStName( stugroup, stNum );
  118.         //用于显示所有资料信息的 (我只显示了名字和成绩,其他你可以加上)
  119.         ShowAllStuInfo( stugroup, stNum, subNum );
  120.         //用于释放已经申请的空间的。
  121.         deleteInfo( stugroup, stNum );
  122.         return 0;
  123. }

  124. //fgets是会保存\n的, 而scanf是不会保存\n的。
  125. //如果学完链表可以用链表实现,就不用输入什么学生数和科目数了,可以直接加。
复制代码




学习学习,写了一下代码,你看看。
希望对你有帮助,支持支持{:7_155:}

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-22 21:37:50 | 显示全部楼层
路过,帮顶,让大家可以看到,让问题得以解决
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-23 05:15:07 | 显示全部楼层
请问学链表了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-23 06:00:21 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #define MAX 20
  4. struct score
  5. {
  6.         char score_name[MAX];
  7.         char stu_score[MAX];
  8. };
  9. struct stu
  10. {
  11.         char name[MAX];
  12.         char num[MAX];
  13.         struct score *score_stu;
  14.         char passwd[MAX];
  15. };
  16. int main(int argc, char *argv[])
  17. {
  18.         int stu_number, score_name_number;
  19.         struct stu *pstu;
  20.         printf("请输入你要设置的学生人数: ");
  21.         scanf("%d", &stu_number);
  22.         printf("请输入每个学生的学科数: ");
  23.         scanf("%d", &score_name_number);
  24.         if((stu_number <= 0) || (score_name_number <= 0))
  25.         {
  26.                 printf("设置出错!\n");
  27.                 return 0;
  28.         }
  29.         pstu = (struct stu*)malloc(sizeof(struct stu)*stu_number);//学生人数
  30.         if(pstu == NULL)
  31.         {
  32.                 printf("内存不足!\n");
  33.                 return 0;
  34.         }
  35.         for(int i = 0; i < stu_number; ++i)
  36.         {
  37.                 fflush(stdin);
  38.                 printf("请输入第%d个学生的学号: ", i+1);
  39.                 gets(pstu[i].num);
  40.                 printf("请输入第%d个学生的名字: ", i+1);
  41.                 fflush(stdin);
  42.                 gets(pstu[i].name);
  43.                 printf("请输入第%d个学生的密码: ", i+1);
  44.                 fflush(stdin);
  45.                 gets(pstu[i].passwd);
  46.                 pstu[i].score_stu = (struct score*)malloc(sizeof(struct score)*score_name_number);//学科数目
  47.                 if(pstu[i].score_stu == NULL)
  48.                 {
  49.                         printf("内存不足!\n");
  50.                         return 0;
  51.                 }
  52.                 for(int j = 0; j < score_name_number; ++j)
  53.                 {
  54.                         fflush(stdin);
  55.                         printf("请输入第%d个学生的第%d科科目: ", i+1, j+1);
  56.                         gets(pstu[i].score_stu[j].score_name);
  57.                         fflush(stdin);
  58.                         printf("请输入第%d个学生的第%d科成绩: ", i+1, j+1);
  59.                         gets(pstu[i].score_stu[j].stu_score);
  60.                 }
  61.         }
  62.         return 0;
  63. }
复制代码
这样行不, 我初学, 不要见怪......

评分

参与人数 1鱼币 +2 收起 理由
fanki + 2 热爱鱼C^_^ 一起学习~~

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-23 15:33:12 | 显示全部楼层
//楼主的错误比较明显,就是&符号什么时候用。注意:char a[10]的话a就是a[10]的首地址,所以是scanf("%s",a)而不是scanf("%s",&a);但是对于float f,就要用scanf(pf,"%f",&f);因为这个f的地址是&f。
上图
help.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-23 15:36:13 | 显示全部楼层

顺便在提醒一下,C语言是不能在for(int i=0;i<M;i++)定义i变量的。这是C++才可以的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-23 15:39:01 | 显示全部楼层
小号4 发表于 2013-6-23 15:33
//楼主的错误比较明显,就是&符号什么时候用。注意:char a[10]的话a就是a[10]的首地址,所以是scanf("%s", ...

打错了,scanf多了个参数。scanf(pf,"%f",&f);改成scanf("%f",&f);
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-24 19:31:21 | 显示全部楼层
本帖最后由 fanki 于 2013-6-25 19:41 编辑

如果把所有数组长度都定了就好做啦~~


  1. #include "stdio.h"
  2. #define  M 4
  3. #define  N 2

  4. struct s_course
  5. {
  6.         char coursename[20];
  7.         float score;
  8. };

  9. struct s_student
  10. {
  11.         char name[20];
  12.         char num[4];
  13.         s_course course[M];
  14.         char password[7];
  15. } student[N];

  16. int main(int argc, char* argv[])
  17. {
  18.         //printf( "请输入姓名,学号,新密码:" );
  19.         int i = 0, j = 0;
  20.         for ( i = 0; i < N; i++ )
  21.         {
  22.                 printf( "请输入第%d个学生的姓名,学号,新密码:", i + 1 );
  23.                 scanf( "%s", student[i].name );
  24.                 scanf( "%s", student[i].num );
  25.                 scanf( "%s", student[i].password );
  26.                 /*如果要输入成绩再这里加*/
  27.                
  28.                 for( j = 0; j < M; j++ )
  29.                 {
  30.                         printf( "请输入第%d科名称和成绩:", j + 1 );
  31.                         scanf( "%s", student[i].course[j].coursename );
  32.                         scanf( "%f", &student[i].course[j].score );
  33.                 }
  34.                
  35.         }
  36.         return 0;
  37. }
复制代码




这样看看是不是你想要的~~
希望帮到你~~一起学习~~加油~~{:7_155:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-25 19:26:32 | 显示全部楼层
fanki 发表于 2013-6-24 19:31
如果把所有数组长度都定了就好做啦~~
#include "stdio.h"
#define  M 4

开始我也是这样想的,那是你发现没有你填写课程跟分数填写失败。。。  因为你第一个结构体没有实体,就定义了他的内套结构体。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-25 19:33:19 | 显示全部楼层
Skuone 发表于 2013-6-25 19:26
开始我也是这样想的,那是你发现没有你填写课程跟分数填写失败。。。  因为你第一个结构体没有实体,就定 ...

可以吖楼主~~我怎么可以~~
不会吧~~这这这~~
我再看看~~应该没有问题的~~你宏定义了个数的话是没有问题的~~空间早就定了呀~~
{:7_175:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-25 19:34:33 | 显示全部楼层
fanki 发表于 2013-6-25 19:33
可以吖楼主~~我怎么可以~~
不会吧~~这这这~~
我再看看~~应该没有问题的~~你宏定义了个数的话是没有问题 ...

分数是你输入的类型不匹配吧???
float要加f的后续~~
如果用double就没有问题了~~或者你输入的时候加f~~试试~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-25 19:43:10 | 显示全部楼层
Skuone 发表于 2013-6-25 19:26
开始我也是这样想的,那是你发现没有你填写课程跟分数填写失败。。。  因为你第一个结构体没有实体,就定 ...


  1. #include "stdio.h"
  2. #define  M 4
  3. #define  N 2

  4. struct s_course
  5. {
  6.         char coursename[20];
  7.         float score;
  8. };

  9. struct s_student
  10. {
  11.         char name[20];
  12.         char num[4];
  13.         s_course course[M];
  14.         char password[7];
  15. } student[N];

  16. int main(int argc, char* argv[])
  17. {
  18.         //printf( "请输入姓名,学号,新密码:" );
  19.         int i = 0, j = 0;
  20.         for ( i = 0; i < N; i++ )
  21.         {
  22.                 printf( "请输入第%d个学生的姓名,学号,新密码:", i + 1 );
  23.                 scanf( "%s", student[i].name );
  24.                 scanf( "%s", student[i].num );
  25.                 scanf( "%s", student[i].password );
  26.                 /*如果要输入成绩再这里加*/
  27.                
  28.                 for( j = 0; j < M; j++ )
  29.                 {
  30.                         printf( "请输入第%d科名称和成绩:", j + 1 );
  31.                         scanf( "%s", student[i].course[j].coursename );
  32.                         //之前忘记取地址了~~输入的时候最后加f
  33.                         //如果不想加f的话类型用double
  34.                         scanf( "%f", &student[i].course[j].score );
  35.                 }
  36.                
  37.         }
  38.         return 0;
  39. }
复制代码



你试试吧~~可以哇~~
希望对你有帮助~~
{:7_155:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-22 10:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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