| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 468 人关注过本帖
标题:运行错误:关于结构体中共用体的一点问题,求指教!
只看楼主 加入收藏
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
结帖率:100%
收藏
已结贴  问题点数:40 回复次数:8 
运行错误:关于结构体中共用体的一点问题,求指教!
//引用共用体数据
/*题目:有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、
性别、职业、班级。教师的数据包括:姓名、号码、职业、性别、职务。要求
用同一个表格处理。
*/
//为简化程序,现只设两个人,一个教师,一个学生。
/*学生信息-num:101;  name:Li;  sex:f; job:s; class:501;
  教师信息-num:102;  name:He;  sex:m;  job:t;  position:professor;
*/
#include"stdio.h"
struct
{
    int num;                  //编号
    char name[20];            //姓名
    char sex;                 //性别
    char job;                 //职业
    union                     //申明无名共用体类型
    {
        int stu_class;        //班级
        char position[20];    //职务
    }category;                //成员category是共用体变量
}person[2];                   //定义结构体数组,有2个元素
void main()
{
    int i;
    for(i=0;i<2;i++)
    {
        printf("Please input the data of person:\n");
        scanf("%d%s%c%c",&person[i].num,person[i].name,//此处.name为数组名,不必加'&'.
            &person[i].sex,&person[i].job);           //输入前四项
        if(person[i].job=='s')
            scanf("%d",&person[i].category.stu_class);//如是学生,输入班级
        else if(person[i].job=='t')
            scanf("%s",person[i].category.position);  //如是老师,输入职务
        else printf("Data error,input again!");       //如'job'不是's'或't',显示错误
    }
    printf("\n");
    for(i=0;i<2;i++)
    {
        if(person[i].job=='s')     //若是学生,输出
            printf("The student's information:\nnumber:%d\nname:%s\nsex:%c\njob:%c\nclass:%d\n",
            person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.stu_class);
        else if(person[i].job=='t')//若是老师,输出
            printf("The teacher's information:\nnumber:%d\nname:%s\nsex:%c\njob:%c\nposition:%s\n",
            person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.position);
    }
}
/*PS:程序编译是没有问题的。
程序运行后,我是这样输入的:101(空格)Li(空格)f(空格)s(空格)501(回车)
结果系统没有让我接着输入下一个数据,而是执行我程序里面的两句话:
Please input the data of person:
Data error,input again!
跳过了第二次输入数据以及后面的输出。
是程序本身有问题,还是我输入有问题?
<此题是谭浩强《C语言程序设计》第四版P321-例9.11>
望大家赐教!
*/


搜索更多相关主题的帖子: 教师 position include 结构体 
2012-12-30 12:20
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
先自己顶下吧。
版面有点大,可能吓着大家了。
2012-12-30 12:42
StarFall
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:193
专家分:553
注 册:2012-10-1
收藏
得分:20 
#include"stdio.h"
struct
{
    int num;                  //编号
    char name[20];            //姓名
    char sex;                 //性别
    char job;                 //职业
    union                     //申明无名共用体类型
    {
        int stu_class;        //班级
        char position[20];    //职务
    }category;                //成员category是共用体变量
}person[2];                   //定义结构体数组,有2个元素
void main()
{
    int i;
    for(i=0;i<2;i++)
    {
        printf("Please input the data of person:\n");
        scanf("%d %s %c %c",&person[i].num,person[i].name,//此处.name为数组名,不必加'&'.
            &person[i].sex,&person[i].job);           //输入前四项
        if(person[i].job=='s')
            scanf("%d",&person[i].category.stu_class);//如是学生,输入班级
        else if(person[i].job=='t')
            scanf("%s",person[i].category.position);  //如是老师,输入职务
        else printf("Data error,input again!");       //如'job'不是's'或't',显示错误
    }
    printf("\n");
    for(i=0;i<2;i++)
    {
        if(person[i].job=='s')     //若是学生,输出
            printf("The student's information:\nnumber:%d\nname:%s\nsex:%c\njob:%c\nclass:%d\n",
            person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.stu_class);
        else if(person[i].job=='t')//若是老师,输出
            printf("The teacher's information:\nnumber:%d\nname:%s\nsex:%c\njob:%c\nposition:%s\n",
            person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.position);
    }
}

拿去试吧

去追寻更高的技术领域。永不停止。
2012-12-30 12:43
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 3楼 StarFall
为什么“%d %s %c %c”之间要加空格,可以解释下吗?以前输入几个整数的时候不加没事啊。
2012-12-30 13:02
StarFall
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:193
专家分:553
注 册:2012-10-1
收藏
得分:0 
应该是因为有字符数组。

去追寻更高的技术领域。永不停止。
2012-12-30 13:55
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
好吧,谢谢。
2012-12-30 15:27
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:20 
以下是引用a4811在2012-12-30 13:02:04的发言:

为什么“%d %s %c %c”之间要加空格,可以解释下吗?以前输入几个整数的时候不加没事啊。
如果不加空格:
在接收时先读入%d,然后读到空格或字符开始由%s读取,在scanf函数中字符串是以空格视为结尾,然后是单个字符,如果用户输入稍微错点%c很容易会和前面的%s相混合,加上空格表示以空白符为分界符号,可以加强程序的牢固性

I have not failed completely
2012-12-30 19:44
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 7楼 神龙赖了
感谢!
2012-12-30 19:53
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
回复 8楼 a4811
同谢...

I have not failed completely
2012-12-30 21:02
快速回复:运行错误:关于结构体中共用体的一点问题,求指教!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.047312 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved