C语言结构体,求大佬指点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言结构体,求大佬指点相关的知识,希望对你有一定的参考价值。
题目:编写程序从键盘输入5个学生的信息,在屏幕上输出这5个学生的信息。要求用结构体数组保存学生的信息,用函数实现结构体数组的输入输出。
#include<stdio.h>
#include<string.h>
typedef struct date
int year;
int month;
int day;
DATE;
typedef struct student
int num;
char name[20];
char sex;
DATE birthday;
float score;
STUDENT;
void inputarr(STUDENT s[ ], int n);
void outputarr(STUDENT s[ ], int n);
int main()
STUDENT b[5];
inputarr(b,5);
outputarr(b,5);
return 0;
这段代码之后应该咋写呢?
void inputarr(STUDENT s[ ], int n)
int i;
for(i = 0; i < n; ++i)
printf("输入第%d个学生的信息:\\n",i + 1);
printf("学号:");
scanf("%d",&s[i].num);
printf("姓名:");
scanf("%s",s[i].name);
printf("性别:");
scanf("%s",s[i].sex);
printf("成绩:");
scanf("%f",&s[i].score);
printf("出生日期: xxxx:xx:xx :");
scanf("%d:%d:%d",&s[i].birthday.year,&s[i].birthday.month,&s[i].birthday.day);
void outputarr(STUDENT s[ ], int n)
int i;
for(i = 0; i < n; ++i)
printf("%d %s %s [%04d:%02d:%02d] %.2lf\\n",s[i].num,s[i].name,s[i].sex);
printf("[%04d:%02d:%02d] %.2lf\\n",s[i].birthday.year,s[i].birthday.month,s[i].birthday.day,s[i].score);
printf("\\n");
参考技术A // 把用到的两个函数方法定义即可void inputarr(STUDENT s[ ], int n)
int i;
for(i = 0; i < n; i++)
printf("Enter %d student's infor(Name birthday score):\n", i+1);
scanf("%s %c %d %d %d %f", s[i].name, &s[i].sex, &s[i].birthday.year,
&s[i].birthday.month, &s[i].birthday.day, &s[i].score);
void outputarr(STUDENT s[ ], int n)
int i;
for(i = 0; i < n; i++)
printf("%s %c %d %d %d %.2f\n", s[i].name, s[i].sex, s[i].birthday.year,
s[i].birthday.month, s[i].birthday.day, s[i].score);
求解答c语言结构体定义中typedef的作用
看大部分C代码中,定义结构体总是要使用typedef关键字,求高手给解答下这个关键字的用途,比如有代码如下:
typedef struct tagMyStruct
int iNum;
long lLength;
MyStruct;
上面的代码写成如下不是更简单吗:
struct MyStruct
int iNum;
long lLength;
;
c语言结构体定义中typedef的作用是为一种数据结构体定义一个新名字。
在c语言中使用typedef帮助定义结构体,对于声明结构体变量,便可以直接使用typedef xxx(结构体名 对象名)的形式,而没必要带上struct关键词。实际项目C代码中,结构体的定义一般都使用了typedef,在大量使用结构体变量的场合,这样会省事很多。
扩展资料:
在编程中typedef能够给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。typedef和#define不同,它不是简单的文本替换。如果定义中包含表达式,必须使用括号。
typedef符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。与auto、extern、mutable、static、register等关键字不能出现在同一个结构体定义中。
参考技术A 写成下面的是简单,但是定义一个结构体变量的时候呢就麻烦了。要写成struct MyStruct ms;这样定义。
而上面的有typedef的则不要,直接写MyStruct ms;这样
即typedef struct tagMyStruct MyStruct;后,原先定义结构体变量需要
struct tagMyStruct ms;
现在只要写成MyStruct ms了。追问
还是不太明白,比如这样,我要使用的结构体变量名称就是MyStruct,然后如果我不用typedef关键字的话,我不能直接用下面的代码来定义吗?
struct MyStruct
int iNum;
long lLength;
;
必须要如下这样才可以使用MyStruct变量?
struct tagMyStruct
int iNum;
long lLength;
;
struct tagMyStruct MyStruct;
下面分明多了一行,更麻烦了吗
不要一会MyStruct一会tagMyStruct的,要明白问题的所在。
就是下面的意思:
如果定义为:
struct MyStruct
int iNum;
long lLength;
;
那么必须struct MyStruct ss;这样定义变量
如果定义为:
typedef struct MyStruct
int iNum;
long lLength;
MyStruct;
那么就可以MyStruct ss这样定义了。
按你的解答,变量是ss,那样MyStruct直接不用了,直接用ss了,最节省的写法,如下:
struct ss
int iNum;
long lLength;
;
这样不更简单的搞定了吗?干嘛还要写一行?
这位同学,您对结构体和结构体变量还没有搞清楚。
struct ss
int iNum;
long lLength;
;
那么ss就是一个结构体了,而struct ss s后,s才是结构体ss类型的变量。
哦,原来如此……
另外还有一个疑问,如此的话是不是结构体声明必须在文件开始处(函数外),结构体变量声明可以在任何地方?
结构体定义必须在第一次使用结构体定义变量之前定义,倒不是一定要放在最前面,但一般放在最前面。结构体变量放在使用使用的地方即可。
同学,声明和定义您又没有搞清楚。
extern struct ss s;这是声明结构体变量
struct ss s;这是定义结构体变量
typedef struct tagMyStruct
int iNum;
long lLength;
MyStruct;
这种定义之后,之后定义struct tagMyStruct结构体变量时,可以直接使用MyStruct代替struct tagMyStruct,例如MyStruct a。
注意如果没有使用typedef,下面这种模式:
struct MyStruct
int iNum;
long lLength;
;
那么定义结构体变量必须 struct MyStruct a这种方式定义。
所以typedef有简化变量声明的作用,还有就是在跨平台方面有很大作用,定义机器无关类型。
c++标准库使用的 typedef 来创建平台无关类型例如size_t,ptrdiff 和 fpos_t 。 参考技术C C里面在定义结构体类型的变量时要有struct关键字,如果按照你下面的写法就必须写成:
struct MyStruct a;
但是使用typedef则是为结构体类型给了一个新名字,按原先上面的写法就直接写成:
MyStruct a; 参考技术D 加上typedef意为标签式定义,在结构体定义之后,在定义类型时直接可以用结构体的名字去定义对象。而不加上typedef的话为类型名定义,也就要求之后再定义对象时需要加上 struct MyStruct 才可以进行对象定义。
以上是关于C语言结构体,求大佬指点的主要内容,如果未能解决你的问题,请参考以下文章