结构体数组指针作为函数参数,通过数组的首地址与偏移量对结构体数组进行scanf的赋值,在函数中通过指针间接访问到其指向的内存。
举例:编写函数,输入5个学号(int),5个姓名(字符串),5个成绩数组(每组三个成绩)(int[3]),依次调用函数
#include <stdio.h>
#include <stdlib.h>
struct student //建立结构体,学号,姓名,3门课的分数
{
int num
char name[10]
int score[3]
}Stu[5] //初始化,一共5个学生的数据
void getScore(struct student * p) //函数:向结构体读取分数,一共三门课
{
int i, j
for (i = 0i <5i++)
for (j = 0j <3j++)
scanf_s("%d", (&(p+i)->score[j]))
}
void getNum(struct student * p) //函数:向结构体读取学号
{
int i
for (i = 0i <5i++)
scanf_s("%d", &(p + i)->num)
}
void getName(struct student * p) //函数:向结构体读取姓名
{
int i
for (i = 0i <5i++)
scanf("%s", &(p + i)->name)
}
int main()
{
int i, j, average[3] = { 0 } //average数组储存每门课的平均分
getNum(Stu) //函数调用
getName(Stu)
getScore(Stu)
for (j = 0j <3j++)
{
for (i = 0i <5i++)
average[j] += Stu[i].score[j]
}
for (i = 0i <5i++)
{
printf("num = %d name = %s Score:", Stu[i].num, Stu[i].name) //依次打印学号 姓名
//printf("%d %d %d", Stu[0].score[0],Stu[0].score[1],Stu[0].score[2])
for (j = 0j <3j++) //打印三门课的分数
printf(" %d", Stu[i].score[j])
printf("\n")
}
printf("average:")
for (i = 0i <3i++)
printf("%f ", (float)average[i]/5) //打印三门课平均分
printf("\n")
system("pause")
return 0
}
如:
scanf("%c%c%c",&a,&b,&c)
输入为:
d e f
则把'd'赋予a, ' '(空格)赋予b,'e'赋予c。因为%c 只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此把' '作为下一个字符送给b。
只有当输入为:def(字符间无空格) 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。
扩展资料:1、函数原型
int scanf(const char * restrict format,...)
函数 scanf() 是从标准输入流stdin [1] (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。
函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。每一个指针要求非空,并且与字符串中的格式符一一顺次对应。
2、返回值
scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。如:
scanf("%d %d",&a,&b)函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2;
如果只有a被成功读入,返回值为1;如果a和b都未被成功读入,返回值为0;如果遇到错误或遇到end of file,返回值为EOF。end of file为Ctrl+z 或者Ctrl+d。
例:使用scanf函数输入数据。
#include <stdio.h>
int main(void)
{
int a,b,c
printf("Give me the value of a,b,c seperated with whitespaces:\n")
scanf("%d%d%d",&a,&b,&c)
printf("a=%d,b=%d,c=%d\n",a,b,c)
return 0
}
注意:&a,&b,&c中的&是寻址操作符,&a表示对象a在内存中的地址,是一个右值。变量a,b,c的地址是在编译阶段分配的(存储顺序由编译器决定)。
如果scanf中%d是连着写的如“%d%d%d”,在输入数据时,数据之间不可以用逗号分隔,只能用空白字符(空格或tab键或者回车键)分隔——“2 (空格)3(tab) 4” 或 “2(tab)3(回车)4”等。若是“%d,%d,%d”,则在输入数据时需要加“,”,如“2,3,4”。
参考资料:
百度百科——scanf(计算机语言函数)
分类: 电脑/网络 >>程序设计 >>其他编程语言问题描述:
结构体数组赋值问题我在使用结构体数组的时候遇到这个问题,想了好长时间也没弄明白其中的原因,程序如下:
main()
{
struct abc
{
char name
int a
float b
}
struct abc stu[3]
int i
printf("please input:\n")
for(i=0i<3i++)
scanf("%c %d %f",&stu[i].name,&stu[i].a,&stu[i].b)
printf("you just input:\n")
for(i=0i<3i++)
printf("%-5c%-10d%-10.2f",stu[i].name,stu[i].a,stu[i].b)
}
这是一个试验程序,在给结构体数组赋值后就原样输出以验证赋值是否正确。但是程序执行时没有显示结果即退出。把结构体数组改成只有一个结构体变量,程序如下:
main()
{
struct abc
{
char name
int a
float b
}
struct abc stu
printf("please input:\n")
scanf("%c %d %f",&stu.name,&stu.a,&stu.b)
printf("%5c%10d%10.2f",stu.name,stu.a,stu.b)
}
编译执行,可以得到预期结果。我想验证是不是循环的问题,又将程序改成下面这样:不用求输入数据,而在程序内部给结构体变量数组赋初值,然后再用循环输出,程序如下:
main()
{
struct abc
{char name
int a
float b
}
struct abc stu[3] = {{'a',12,34},{'b',56,78},{'c',90,12}}
int i
for(i=0i<3i++)
printf("\n%-5c%-10d%-10.2f",stu[i].name,stu[i].a,stu[i].b)
}
编译执行,能够得到正确结果。最后确定只是在对结构体数组各元素成员以循环方式输入数值的时候出了问题,即第一个程序加粗的两行。但是我百思不得其解,不知究竟是什么原因。请大家帮忙解决一下。
解析:
之所以出现你说的问题,是因为当执行
for(i=0i<3i++)
scanf("%c %d %f",&stu[i].name,&stu[i].a,&stu[i].b)
这步的时候,由于回车也算是一个字符,循环的时候把回车也赋给name了/所以输出的时候就会错误了.想解决这个问题只要把回车那个字符给吃掉就可以了.把这个循环改成:
for(i=0i<3i++)
{
scanf("%c %d %f",&stu[i].name,&stu[i].a,&stu[i].b)
getchar()
}
就没问题了.