结构体数组的赋值方法(常用的三种,包含字符串)

本文详细介绍了C语言中结构体数组的三种赋值方式:按成员变量赋值,对数组整体赋值,以及使用输入进行赋值。通过实例代码展示了如何通过初始化函数、直接赋值、循环赋值以及函数调用来实现结构体数组的赋值操作,帮助读者深入理解C语言结构体数组的使用。

目录

一、按照成员变量进行赋值(麻烦,好理解,字符串赋值需要strcpy)

二、对数组整体进行赋值。(一次性需要把所有的都添加进去,不需要strcpy)

       (1) 在声明数组的时候,进行赋值

        (2)对有规律的数据赋值,比如学生结构体的学号是有规律的。

 三、使用输入进行赋值

(1)直接使用for,配合动态分配内存,这里按照数据库的数据类型,我将学号定义为char型,实际上定义为int 即可。

 (2)调用函数赋值,我们知道,结构体数组中,数组有多个元素,每个数组元素又有多个结构体成员变量,所以将每个数组元素用函数分别去赋值。

(3)通过指针给到其他函数去赋值(如果你看到这,才到了精髓,传参赋值)


一、按照成员变量进行赋值(麻烦,好理解,字符串赋值需要strcpy)

        这里使用了一个Init函数,为了在进一步说明传参的使用。实际上赋值按照需要放在主函数就行。

        (使用strcpy函数需要添加头文件string.h)

	#include <stdio.h>
	#include <string.h>
	
	typedef struct date  //定义了一个日期结构体,包含年月日三个成员 
	{
		int year;
		int mouth;
		int day;
	}datea;
	
	typedef struct  schedule//定义了一个日程结构体,包含日期,和活动两个成员变量 
	{
		char name[10];
		datea date;
		char activity[200];
	}sch;
	
	int Init(sch *name)  //初始化函数 数组用指针接收 
	{
		strcpy(name[0].name,"jack");
		name[0].date.year = 2021; //使用级联运算 
		name[0].date.mouth = 11;
		name[0].date.day = 11;
		strcpy(name[0].activity,"Taobao shooping");
		
		strcpy(name[1].name,"Amy");
		name[1].date.year=2021;
		name[1].date.mouth = 11;
		name[1].date.day = 12;
		strcpy(name[1].activity,"play piano");
	 } 
	
	
	int main()
	{
		sch name[2] ;
		Init(name);		
		for(int i=0;i<2;i++)
		{
		
		
			printf("%s %d %d %d \n%s \n",name[i].name,name[i].date.year,name[i].date.mouth,name[i].date.day,name[i].activity);		
		}
		
	}

二、对数组整体进行赋值。(一次性需要把所有的都添加进去,不需要strcpy)

       (1) 在声明数组的时候,进行赋值

        可以换行,中间的结构体嵌套需要再次使用花括号括起来(这里没有传参,放在被调函数不能这么赋值)。

sch name[2] = {{"jack",{2021,11,11},"Taobao Shopping"},
						{"jack",{2021,11,11},"Taobao Shopping"}};

也可以直接写下去:

typedef struct student {
    int sno;
    char name[20];	
} stu;

int main() {
    stu stua[5] = {1001,"jack",1002,"Amy"};

输出结果:

这里举了个例子,定义了一维数组name,将name传到被调函数的时候,只剩下了首地址,对其进行赋值是[Error] declaration of 'sch name' shadows a parameter  ,就是说缺少参数,因为只有首地址,并不是完整的数组,所以不能这么赋值。

        (2)对有规律的数据赋值,比如学生结构体的学号是有规律的。

#include <stdio.h>

typedef struct student  //定义了学生结构体 
{
	int sno;
	char name ;
}stu;

stu stua[5];  //5名学生的结构体数组 

int main()
{
	for(int i=1;i<5;i++)
	{
		stua[i].sno=i;  //循环赋值,5名学生的学号依次为1-5 
	}
	
	return 0;
}

 三、使用输入进行赋值

        依然用学生为例子。

(1)直接使用for,配合动态分配内存,这里按照数据库的数据类型,我将学号定义为char型,实际上定义为int 即可。

#include <stdio.h>
#include <stdlib.h>

typedef struct student {
    char sno[6];
    char name[20];	
} stu;

int main() 
{
	int N;
	scanf("%d",&N);//获得学生个数 
    stu * stua = (stu *)malloc(N * sizeof(stua));  //动态分配了结构体变量stua的长度 
    
    //方法一:用for给结构体赋值
	for(int i=0;i<N;i++)
	{
		scanf("%s %s",stua[i].sno,stua[i].name); 	
	 } 
	for(int i=0;i<N;i++)
	{
		printf("%s %s\n",stua[i].sno,stua[i].name);
	 } 
}

输出结果:

 (2)调用函数赋值,我们知道,结构体数组中,数组有多个元素,每个数组元素又有多个结构体成员变量,所以将每个数组元素用函数分别去赋值。

#include <stdio.h>
#include <stdlib.h>

typedef struct student {  //定义结构体 
    char sno[6];         //注意学号为char 
    char name[20];	
} stu;


stu getstu(void)         //结构体函数 
{
    stu tem;

    scanf("%s",tem.sno);//因为是字符串,不用加取址符&,否则此处为&p.x
    scanf("%s",tem.name);
    return tem;
}

int main() 
{
	int N;
	scanf("%d",&N);//获得学生个数 
    stu * stua = (stu *)malloc(N * sizeof(stua));  //动态分配了结构体变量stua的长度 
    
    //方法二:调用函数 
	for(int i=0;i<N;i++)
	{
		stua[i] = getstu();	
	 } 
	 
	for(int i=0;i<N;i++)
	{
		printf("%s %s\n",stua[i].sno,stua[i].name);
	 } 
}

 输出结果:

(3)通过指针给到其他函数去赋值(如果你看到这,才到了精髓,传参赋值)

#include <stdio.h>
#include <stdlib.h>

typedef struct student {  //定义结构体 
    char sno[6];         //注意学号为char 
    char name[20];	
} stu;


void getstu(stu *stua)         //返回值为空即可 
{
    
    scanf("%s",stua -> sno);//因为是字符串,不用加取址符&,否则此处为&stua.x
    scanf("%s",stua -> name);
}

int main() 
{
	int N;
	scanf("%d",&N);//获得学生个数 
    stu * stua = (stu *)malloc(N * sizeof(stua));  //动态分配了结构体变量stua的长度 
    
    //方法二:函数传参赋值 
	for(int i=0;i<N;i++)
	{
		getstu(&stua[i]);
	}
	 
	for(int i=0;i<N;i++)
	{
		printf("%s %s\n",stua[i].sno,stua[i].name);
	 } 
}

执行结果:

以上就是赋值的几种方式,我认为我把全部的方式都写全了,收藏一下吧。 (如有不足,请留言,你的留言对我是极大的鼓励)

<think>嗯,用户想知道在C语言中如何修改结构体的成员值,还要求给出示例。首先,我需要回忆一下结构体的基本操作。结构体在C语言里是通过定义结构体类型,然后声明变量或者数组来使用的。修改结构体成员的关键在于访问操作符,也就是点操作符(.)和箭头操作符(->)。 首先,用户可能需要知道如何声明结构体。比如,定义一个包含不同数据类型的结构体,比如学生结构体包含姓名、年龄等成员。然后,对于结构体变量的修改,如果是直接声明的变量,应该用点操作符。例如,struct Student s; s.age = 20; 这样。 接下来,如果是结构体指针,就需要用箭头操作符。例如,struct Student *p = &s; p->age = 21; 或者 (*p).age = 21; 这样也可以,但箭头更直观。 然后,用户可能还需要数组的情况。结构体数组的每个元素都是一个结构体,所以可以通过索引访问,再用点操作符修改成员。比如,struct Student arr[5]; arr[0].age = 19; 这样。 另外,需要注意字符串的修改,比如字符数组类型的成员,不能直接用赋值,应该用strcpy函数。例如,strcpy(s.name, "Alice"); 否则会导致编译错误。 可能还需要提醒用户关于结构体成员的可见性,C语言中没有私有成员,所有成员都是公开的,可以直接修改。但有时候可以通过将结构体定义在源文件中,头文件中只放前置声明来实现某种程度的封装,但这是进阶用法,用户可能暂时不需要。 然后,根据提供的引用资料,引用[2]和[4]提到了结构体成员的访问操作符,引用[3]提到了如何计算成员的偏移量,但用户的问题是关于修改值,所以主要参考点操作符和箭头操作符的使用。 现在,需要给出具体的示例代码,包括不同的情况:直接变量、指针、数组,以及字符串的处理。同时,要确保代码语法正确,比如结构体的定义、变量的声明、成员的赋值方式等。 可能还需要注意一些常见错误,比如结构体指针未初始化就访问成员,或者字符数组赋值不当。在示例中要避免这些问题,或者指出注意事项。 最后,生成相关问题,帮助用户进一步学习,比如如何动态分配结构体内存,结构体作为函数参数传递,或者如何避免浅拷贝的问题。这样用户可以有继续探索的方向。</think>在C语言中修改结构体成员值主要通过结构体变量直接访问或指针间接访问实现,以下是具体方法和示例: ### 一、直接修改结构体成员值 使用点操作符`.`直接访问结构体变量成员: ```c #include <stdio.h> #include <string.h> struct Student { char name[20]; int age; float score; }; int main() { // 定义结构体变量 struct Student s1; // 修改成员值 strcpy(s1.name, "张三"); // 字符串需用strcpy赋值[^2] s1.age = 18; // 直接赋值整型成员 s1.score = 90.5f; // 直接赋值浮点成员 printf("姓名:%s 年龄:%d 分数:%.1f\n", s1.name, s1.age, s1.score); return 0; } ``` ### 二、通过指针修改结构体成员值 使用箭头操作符`->`或解引用后使用`.`操作符: ```c int main() { struct Student s2; struct Student *p = &s2; // 定义结构体指针 // 通过指针修改成员 strcpy(p->name, "李四"); // 使用->操作符[^4] p->age = 20; // 等价于 (*p).age = 20 p->score = 88.5f; printf("姓名:%s 年龄:%d 分数:%.1f\n", p->name, p->age, p->score); return 0; } ``` ### 三、修改结构体数组元素 ```c int main() { struct Student arr[3] = { {"王五", 19, 75.0}, {"赵六", 20, 82.5}, {"陈七", 21, 93.0} }; // 修改第二个元素的值 strcpy(arr[1].name, "周八"); arr[1].score = 95.5f; // 通过指针遍历修改 struct Student *ptr = arr; for(int i=0; i<3; i++){ (ptr+i)->age += 1; // 所有年龄+1 } return 0; } ``` ### 关键注意事项 1. **字符串成员**必须使用`strcpy`进行赋值,直接`=`会编译报错 2. **指针操作**前需确保指针已指向有效内存空间 3. **嵌套结构体**成员通过多级访问符修改,如`obj.inner_struct.member`
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程图一乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值