首頁 > 軟體

C語言結構體陣列常用的三種賦值方法(包含字串)

2022-06-14 18:01:05

一、按照成員變數進行賦值(麻煩,好理解,字串賦值需要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 %sn",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 %sn",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 %sn",stua[i].sno,stua[i].name);
	 } 
}

執行結果:

總結

到此這篇關於C語言結構體陣列常用的三種賦值方法的文章就介紹到這了,更多相關C語言結構體陣列賦值內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com