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

 更新时间:2022年06月14日 15:10:07   作者:编程图一乐  
C语言只有在定义字符数组的时候才能用“=”来初始化变量,其它情况下是不能直接用“=”来为字符数组赋值的,下面这篇文章主要给大家介绍了关于C语言结构体数组常用的三种赋值方法,需要的朋友可以参考下

一、按照成员变量进行赋值(麻烦,好理解,字符串赋值需要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);
	 } 
}

执行结果:

总结

到此这篇关于C语言结构体数组常用的三种赋值方法的文章就介绍到这了,更多相关C语言结构体数组赋值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言不定长数组及初始化方法

    C语言不定长数组及初始化方法

    今天小编就为大家分享一篇C语言不定长数组及初始化方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • DSP中浮点转定点运算--定点数模拟浮点数运算及常见的策略

    DSP中浮点转定点运算--定点数模拟浮点数运算及常见的策略

    本文主要讲解DSP中定点数模拟浮点数运算及常见的策略,具有参考价值,需要的朋友可以参考一下。
    2016-06-06
  • C语言例题讲解指针与数组

    C语言例题讲解指针与数组

    在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活
    2022-07-07
  • C语言形参和实参传值和传址详解刨析

    C语言形参和实参传值和传址详解刨析

    形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用,形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送
    2021-11-11
  • Visual Studio 2022 Preview 使用 C++20 Module的详细过程

    Visual Studio 2022 Preview 使用 C++20 Module的详细过程

    这篇文章主要介绍了Visual Studio 2022 Preview 使用 C++20 Module的过程,本文通过项目分析实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • 深入解析C++编程中的运算符重载

    深入解析C++编程中的运算符重载

    这篇文章主要介绍了C++编程中的运算符重载,运算符重载是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-04-04
  • 从汇编看c++中extern关键字的使用

    从汇编看c++中extern关键字的使用

    本篇文章介绍了,在c++中extern关键字的使用概述,需要的朋友参考下
    2013-05-05
  • VC++ 自定义控件的建立及使用方法

    VC++ 自定义控件的建立及使用方法

    这篇文章主要介绍了VC++ 自定义控件的建立及使用方法的相关资料,十分的详细,需要的朋友可以参考下
    2015-06-06
  • C++ min/max_element 函数用法详解

    C++ min/max_element 函数用法详解

    这篇文章主要介绍了C++ min/max_element 函数用法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • VS2022 Git提交代码的实现

    VS2022 Git提交代码的实现

    本文主要介绍了VS2022 Git提交代码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05

最新评论