C语言中怎么给一个结构体用scanf进行赋值?

作者&投稿:宾冒 (若有异议请与网页底部的电邮联系)
~

结构体数组指针作为函数参数,通过数组的首地址与偏移量对结构体数组进行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 = 0; i < 5; i++)

for (j = 0; j < 3; j++)

scanf_s("%d", (&(p+i)->score[j]));

}

void getNum(struct student * p)  //函数:向结构体读取学号

{

int i;

for (i = 0; i < 5;i++)

scanf_s("%d", &(p + i)->num);

}

void getName(struct student * p)  //函数:向结构体读取姓名

{

int i;

for (i = 0; i < 5; i++)

scanf("%s", &(p + i)->name);

}

int main()

{

int i, j, average[3] = { 0 };   //average数组储存每门课的平均分

getNum(Stu);            //函数调用

getName(Stu);

getScore(Stu);

for (j = 0; j < 3; j++)

{

for (i = 0; i < 5; i++)

average[j] += Stu[i].score[j];

}

for (i = 0; i < 5; i++)

{

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 = 0; j < 3; j++)    //打印三门课的分数

printf(" %d", Stu[i].score[j]);

printf("
");

}

printf("average:");

for (i = 0; i < 3; i++)

printf("%f ", (float)average[i]/5);   //打印三门课平均分

printf("
");

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:
");

scanf("%d%d%d",&a,&b,&c);

printf("a=%d,b=%d,c=%d
",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(计算机语言函数)



C语言中怎么给一个结构体用scanf进行赋值?
答:则把'd'赋予a, ' '(空格)赋予b,'e'赋予c。因为%c 只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此把' '作为下一个字符送给b。只有当输入为:def(字符间无空格) 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。

C语言里如何给结构体成员(一个数组)赋汉字值?
答:Type s ; //用 Type 类型定义一个结构体变量 s ;s.a = " abcdef " ; //给结构体变量 s 赋值为 "abcdef" 。如果是想自己输入的话:gets( s.a ) ; 或者 scanf(" %s " , s,a ) ; //因为是数组,所以输入时候要记住的是 s.a前面是不加地址符&的。希望你全明白了...

C语言结构体Struct怎么使用?
答:struct stuff Huqinwei;第三种:如果该结构体只用一个变量Huqinwei,而不再需要用struct stuff yourname;去定义第二个变量。那么,附加变量初始化的结构体定义还可进一步简化出第三种:struct{ char job[20];int age;float height;}Huqinwei;把结构体名称去掉,这样更简洁,不过也不能定义其他同结构...

C语言结构体Struct怎么使用?
答:在Turbo C中,结构也是一种数据类型, 可以使用结构变量,因此,像其它类型的变量一样,在使用结构变量时要先对其定义。如果需要定义多个具有相同形式的结构变量时用这种方法比较方便,它先作结构说明,再用结构名来定义变量。

C语言怎么给结构体里的结构体赋值?
答:c里面是不能这样赋值的, 这种方式只有在定义的时候初始化才可以 如果 int a[][2] = { 2,2}这是正确的,但是定义数组之后再 a = { 2,2}是不正确的, 你还是一个一个赋值吧. 另外说明一下吧, 定义的时候是给变量申请内存, 编译器会把你初始话的值赋值到内存, 但是如果 以后在赋值的时候,...

C语言求助:定义一个学生结构体数组stu[10],结构体类型?
答:int age; //成员score(分数)的类型为double类型 }stu;void show(stu a[],int n) { for(int i = 0; i < n; ++i)printf("%d\t%d\t%s\t%c\t%d\n",i + 1,a[i].num,a[i].name,a[i].sex,a[i].age);printf("\n\n");} int find(stu a[],int n,int num) { for...

c语言如何定义结构体变量
答:然后,当结构定义完成后,即创建了一种数据类型,可以像int、float等内置类型一样使用,以上面定义的stu结构体来和int类型对比着看。int a;//定义一个int类型的变量a stu a; //定义一个stu类型的变量a int *p; //定义一个int类型的指针p stu *p; //定义一个stu类型的指针p int a[10];//...

C语言:结构体数组怎样做形参?字符数组怎样输出?使用%s?
答:1、print函数定义,记得在TC里参数最好这样写:print(stu)struct student stu[5];{ ……} 2、printf函数中的参数 stu[i].name[20]引用方式是错误的 字符串输出应该使用字符串的首地址,正确的格式应该是:stu[i].name

关于C语言的题目:用结构体定义一个复数,并实现复数的加法、减法和乘法...
答:int im;};void add(struct complex a, struct complex b, struct complex *c){ c->re=a.re+b.re;c->im=a.im+b.im;} void minus(struct complex a, struct complex b, struct complex *c){ c->re=a.re-b.re;c->im=a.im-b.im;} int main(){ struct complex x,y,s,p...

关于c语言通过scanf向结构体输入数据
答:因为你在程序中要求的只是输入日期共计8个数字,中间没有分隔符,所以你在输入时如果掺有其它符号,比如输入了年和日中间有空格或者横线,就会导致不正确。比较好的办法是在输出时提示输入数据的格式,并且使用常见的格式,比如改为以下代码:void main(){ struct date a,b; cout<<"请输入截止...