一、用下标手动给字符数组赋值
-
先给字符数组赋值,并且手动添加结束标志
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]两个字节空出来了
二、通过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; }