滴水三期:day16.2-结构体数组赋值

本文详细介绍了C语言中结构体的使用,包括手动给字符数组赋值、通过strcpy函数赋值以及结构体数组的操作。示例中展示了如何初始化结构体,如何为结构体数组赋值,并提供了打印指定结构体元素信息的函数。此外,还定义了一个包含嵌套结构体的结构体数组,用于存储怪物信息,并给出了赋值和查询函数的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、用下标手动给字符数组赋值

  • 先给字符数组赋值,并且手动添加结束标志0x0或者'\0'都表示一字节十六进制数0x0;最后使用%s打印

    #include "stdafx.h"
    struct Test{
        char arr[10];
    };
    void main(int argc,char* argv[]){
        Test t;
        t.arr[0] = 'z';
        t.arr[1] = 'j';
        t.arr[2] = 'j';
        t.arr[3] = '\0';       //手动赋值时,如果只赋值zjj三个字节数据,那么最后一定要加一个0x0表示结尾,不然后面使用%s打印会打印出来分配给数组的arr[3] 到 arr[9]内存空间中的垃圾数据cc..(烫烫烫...)
        printf("%s",t.arr);
    }
    

    有一个疑问?为什么在结构体中定义char类型的数组,在定义了Test t为t.arr分配内存时,不是挨着从栈顶的低地址开始,而是要空出来两字节内存,从[ebp - 0xC]到[ebp - 0x3]存储,[ebp - 0x2]和[ebp - 0x1]两个字节空出来了

    屏幕截图 2021-12-11 091937

二、通过strcpy给赋值

  • 通过C语言内置的别人写好的函数调用传参来给字符数组赋值

    #include "stdafx.h"
    #include "string.h"   //strcpy是string.h头文件中的一个方法
    struct Test{
        char arr[10];
    };
    
    void main(int argc,char* argv[]){
    	Test t;
    
    	//strcpy(t.arr,"中国");传中文也可以,只是使用GBK两个两个字节的读
    	strcpy(t.arr,"zjj");  //不用加0了
        printf("%s",t.arr);
    	getchar();
    }
    

三、结构体数组赋值

  • 一个数组中还可以存放多个结构体类型元素

    #include "stdafx.h"		
    #include "string.h"		
    		
    struct student{		
    	int num;	
    	char name[20];	
    	char sex;	
    	int age;	
    	int score;	
    	char addr[30];	
    };		
    int main(int argc, char* argv[]){		
    	student stu[10];   //结构体数组
    		
    	stu[0].num = 1001;	    //结构体数组赋值
    	strcpy(stu[0].name,"张三");	
    	stu[0].sex = 'M';	
    	stu[0].age = 20;	
    	stu[0].score = 98;	
    	strcpy(stu[0].addr,"上海");
    	printf("%d %s %c %d %d %s\n",stu[0].num,stu[0].name,stu[0].sex,stu[0].age,stu[0].score,stu[0].addr);
    	return 0;	
    }
    

四、作业

  • 定义一个结构体Monster,能够存储怪的各种信息(至少有一个成员是结构体类型)

  • 声明一个Monster类型的数组,长度为10

  • 编写一个函数,为第二题中的数组赋值

  • 编写一个函数,能够通过怪物ID,打印当前这个怪物的所有信息

    #include "stdafx.h"
    #include "string.h"
    typedef struct direction{
        int x;
        int y;
        int z;
        float time;
    }dir;   //定义别名
    typedef struct Monster{
        char name[10];
        int id;
        short level;
        dir d;
    }mon;  //定义别名
    
    mon arr[10];   //结构体数组,全局变量
    
    void Func(){ //赋值函数
        strcpy(arr[0].name,"风龙");
        arr[0].id = 1;
        arr[0].level = 10;
        arr[0].d.x = 1;
        arr[0].d.y = 1;
        arr[0].d.z = 1;
        arr[0].d.time = 100;
        strcpy(arr[1].name,"火龙");
        arr[1].id = 2;
        arr[1].level = 20;
        arr[1].d.x = 2;
        arr[1].d.y = 2;
        arr[1].d.z = 2;
        arr[1].d.time = 200;
        strcpy(arr[2].name,"水龙");
        arr[2].id = 3;
        arr[2].level = 30;
        arr[2].d.x = 3;
        arr[2].d.y = 3;
        arr[2].d.z = 3;
        arr[2].d.time = 300;
        //......
    }
    
    void Func2(int id){  //打印指定id的怪物信息
        for(int i = 0;i < 10;i++){
            if(arr[i].id == id){
                printf("怪物id为%d的怪物信息:\n姓名\tid\t等级\t坐标\t刷新时间\n",id);
                printf("%s\t%d\t%d\t(%d,%d,%d)\t%f",arr[i].name,arr[i].id,arr[i].level,
                       arr[i].d.x,arr[i].d.y,arr[i].d.z,arr[i].d.time);
            }
        }
    }
    int main(int argc,char* argv[]){
        Func();
        Func2(2);
        return 0;
    }
    
    image-20211211102252850
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值