用C语言做一个通讯录 用c语言结构体数组组

c语言结构体数组初始化
> c语言结构体数组初始化
c语言结构体数组初始化
最近看一段代码有所迷惑,先简单总结一下。有关结构体数组初始化的问题struct _m_usmart_nametab usmart_nametab[]=本文引用地址:{#if USMART_USE_WRFUNS==1 //如果使能了读写操作(void*)read_addr,"u32 read_addr(u32 addr)",(void*)write_addr,"void write_addr(u32 addr,u32 val)", #endif(void*)delay_ms,"void delay_ms(u16 nms)",(void*)delay_us,"void delay_us(u32 nus)", (void*)LCD_Clear,"void LCD_Clear(u16 Color)",(void*)LCD_Fill,"void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)",(void*)LCD_DrawLine,"void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)",(void*)LCD_DrawRectangle,"void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)",(void*)Draw_Circle,"void Draw_Circle(u16 x0,u16 y0,u8 r)",(void*)LCD_ShowNum,"void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)",(void*)LCD_ShowString,"void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)",
(void*)LCD_ReadPoint,"u16 LCD_ReadPoint(u16 x,u16 y)",(void*)fsmc_sram_test_write,"void fsmc_sram_test_write(u8 data,u32 addr)",(void*)fsmc_sram_test_read,"u8 fsmc_sram_test_read(u32 addr)",(void*)mymalloc,"void *mymalloc(u8 memx,u32 size)",(void*)myfree,"void myfree(u8 memx,void *ptr)",(void*)mf_mount,"u8 mf_mount(u8 drv)",(void*)mf_open,"u8 mf_open(u8*path,u8 mode)",(void*)mf_close,"u8 mf_close(void)",(void*)mf_read,"u8 mf_read(u16 len)",(void*)mf_write,"u8 mf_write(u8*dat,u16 len)",(void*)mf_opendir,"u8 mf_opendir(u8* path)",(void*)mf_readdir,"u8 mf_readdir(void)",(void*)mf_scan_files,"u8 mf_scan_files(u8 * path)",(void*)mf_showfree,"u32 mf_showfree(u8 *drv)",(void*)mf_lseek,"u8 mf_lseek(u32 offset)",(void*)mf_tell,"u32 mf_tell(void)",(void*)mf_size,"u32 mf_size(void)",(void*)mf_mkdir,"u8 mf_mkdir(u8*pname)",(void*)mf_fmkfs,"u8 mf_fmkfs(u8 drv,u8 mode,u16 au)",(void*)mf_unlink,"u8 mf_unlink(u8 *pname)",(void*)mf_rename,"u8 mf_rename(u8 *oldname,u8* newname)",(void*)mf_gets,"void mf_gets(u16 size)",(void*)mf_putc,"u8 mf_putc(u8 c)",(void*)mf_puts,"u8 mf_puts(u8*c)", };_m_usmart_nametab的结构体如下//函数名列表 struct _m_usmart_nametab{void* //函数指针const u8* //函数名(查找串) };一开始一直不明白,为什么下边的只有两个参数,而上边的确有那么多,难道不是一一对应?其实上边的是一个table表,就像 u8 table[]={};而上边的定义的是一个结构体的数组,其成员很多。但每一个成员应该和结构体类型一致,这只不是定义一个这样结构类型的结构体数组而已。看下面例子typedef struct _TEST_T {char c[10];}TEST_T;TEST_T gst = {1, &12345&};//可以初始化,设置i为1,s为一个字符串.TEST_T gst = {1};//初始化个数少于实际个数时,只初始化前面的成员。TEST_Tgst = {.c=&12345&};//有选择的初始化成员。复合字面量。gst = (TEST_T){122, "1256"};//这是一个赋值语句,也可以作为初始化。可以出现在程序的任何地方。当然也可以使用复合字面量来初始化:gst = (TEST_T){.i=122, .c="123"};3、结构体数组可以用多个大括号括起来:TEST_T gst[10] = {{},{},{},{}}也可以初始化其中的一个元素:TEST_T gst[10] = {[2]={}, [3]={}}也可以使用复合字面量:TEST_T gst[10] = {[2].i=0, [3].i={}}
分享给小伙伴们:
我来说两句……
微信公众号二
微信公众号一糖炒栗子的博客
用结构体数组写的通讯录
#include &stdio.h&
#include &stdlib.h&
#include&string.h&
struct student
&char name[30];
&char tel[30];
&& struct student stu[50]={{0,&&,&&}};&& //(定义一个结构体数组,并进行部分初始化。)
void create()
&for(i=0;i&50;i++)
&&if(stu[i].num == 0 )& //(寻找一个空的数组元素stu[i]方便于新通讯的写入。)
&&&printf(&请输入该同学的学号:\n&);
&&&scanf(&%d&,&stu[i].num);
&&&printf(&请输入该同学的姓名:\n&);
&& &&&scanf(&%s&,stu[i].name);
&&&printf(&请输入该同学的电话:\n&);
&&&scanf(&%s&,stu[i].tel);
void delate()
&char x[30];
&printf(&请输入您想要删除的通讯录的同学姓名:&);
&scanf(&%s&,x);
&for(j=0;j&50;j++)
&&&if(strcmp(stu[j].name,x)==0)& //(找到目标操作数组元素stu[j]。)
&&&&&&&&&&&&&&& }
&if(j==49)&& //(当要删除的同学在最后一个元素就不能用下面的方法(用后面的数组元素复制到前一个数组元素)来操作。)
&&&stu[j].num=0;
&&&strcpy(stu[j].name,'\0');
&&&strcpy(stu[j].tel,'\0');
&for(j;j&49;j++)
&&&stu[j].num=stu[j+1].
&&&strcpy(stu[j].name,stu[j+1].name);
&&&strcpy(stu[j].tel,stu[j+1].tel);
void update()
&char z[30];
&printf(&请输入您想更改的通讯录的同学姓名:\n&);
&scanf(&%s&,z);
&for(b=0;b&50;b++)
&&&if(strcmp(stu[b].name,z)==0)
&&&&&&&&&&&&&&& }
&printf(&您想将该同学的学号更改为:\n&);
&scanf(&%d&,&stu[b].num);
&printf(&您想将该同学的姓名更改为:\n&);
&scanf(&%s&,stu[b].name);
&printf(&您想将该同学的电话更改为:\n&);
&scanf(&%s&,stu[b].tel);
void scr()
&char y[30];&
&printf(&请您输入您想查看访问的通讯录的同学姓名:&);
&scanf(&%s&,y);
&for(c=0;c&50;c++)
&&&if(strcmp(stu[c].name,y)==0)
&&&&&&&&&&&&&&& }
&printf(&%d\t,%s\t,%s\n&,stu[c].num,stu[c].name,stu[c].tel);
void printlist()
&for(k=0;k&50;k++)
&&&printf(&%d\t,%s\t,%s\n&,stu[k].num,stu[k].name,stu[k].tel);
int main()
&printf(&************&& 欢迎来到苏嵌154班(南通)通讯录!& **************************&& &);
&printf(&\n&);
&&&printf(&请输入您想要的操作:& c:添加新同学的通讯信息;\n d:删除某位同学的通讯信息;\n u:改正某位同学的通讯信息;\n s:查看访问某位同学的通讯信息 \n;& p& :输出该通讯录所有同学的通讯信息;\n e : 退出\n&);
&&&printf(&\n&);
&&&scanf(&%d&,&a);
&&switch(a)
&&&&case 'c':create();
&&&&case 'd':delate();
&&&&case 'u':update();
&&&&case 's':scr();
&&&&case 'p':printlist();
&&&&case 'e':exit(1);
&&&&default:
&&&&&&printf(&输入有误,请您重新输入!\n&);
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!关于C语言中,典型的一个通讯录制作的简单实例,有不足,还请多多包含
// =====================变量的定义==================================
去描述 联系人名字数组和联系人号码数组的长度
#define NAME_LEN 30
#define NUM_LEN 30
//定义一个宏
去描述联系人列表最多可以放多少个联系人
#define MAX_LEN 1000
#define MYFILENAME "day12.txt"
//描述联系人的信息
& //联系人的姓名
name[NAME_LEN];
& //联系人的号码
num[NUM_LEN];
//多个联系人信息
批量的联系人信息--》
结构体数组去描述整个联系人列表信息 &
定义一个足够长的数组 去保存我们想要存的联系人信息
Person peoples[MAX_LEN];
//创建一个变量&
描述当前数组中 有多少个联系人
current = 0;
// ======================函数的声明=================================
//初始化数据
//添加联系人
//删除联系人
//修改联系人
//展示联系人
//搜索联系人
searchP();
//展示功能列表
showTitle();
//写入文件操作
writToFile();
argc, const
* argv[]) {
& //主逻辑
& & init();
& //展示功能项
& showTitle();
//给用户提示
请输入功能项的序号
& printf("请输入对应功能的序号
//接收用户的输入
& scanf("%d",&user);
//做简单的判断
(user &&span style="font-variant-ligatures:
no-common- color: #272ad8"&1 || user& 6)
printf("没有此功能
别闹 \n");
//假如用户输入的是
(user == 6)
printf("选择了
//判断用户的输入
选择不同的功能
& & printf("选了
添加联系人操作 \n");
& & addP();
& & break;
& & printf("选了
删除联系人操作 \n");
& & delP();
& & break;
& & printf("选了
修改联系人操作 \n");
& & updP();
& & break;
& & printf("选了
展示联系人操作 \n");
& & showP();
& & break;
& & printf("选了
搜索联系人操作 \n");
& & searchP();
& & break;
& & break;
& & return
// ===================函数的实现====================================
//初始化数据
//把文件中的数据 读取出来
存入到 内存中的结构体数组中
& //1.引入头文件
& //2.定义文件指针
并打开文件
& & FILE *fp = fopen(MYFILENAME,
& //3.操作文件
//读取数据
//把文件中存多少条数据
& fread(&current, sizeof(int),
//根据存了多少条数据
进行读取操作
i & i++) {
fread(&peoples[i], sizeof(struct
Person), 1,
& printf("读取完毕
& & }else{
没有上一次&
---& 第一次使用
//printf("");
& //4.关闭文件
& & fclose(fp );
& & printf("初始化完毕
//添加联系人 思路
输入联系人名字
//2.接收联系人名字
输入联系人号码
//4.接收联系人号码
//5.确定添加吗
//6.接受用户的选择
//7.根据用户的选择做出添加操作
添加到内存中的联系人数组中
//7.2 current 进行自增1
将联系人信息写入到文件
& //1.提示
输入联系人名字
& printf("请输入联系人的名字
:(注意请不要输入空格
& //2.接收联系人名字
name[NAME_LEN];
& & scanf("%s",name);
& //3.提示
输入联系人号码
& printf("请输入联系人号码:(注意请不要输入空格)\n");
& //4.接收联系人号码
num[NUM_LEN];
& & scanf("%s",num);
& //5.确定添加吗
& printf("确定添加吗?
& //6.接受用户的选择
& & scanf("%d",&user);
& //7.根据用户的选择做出添加操作
//7.1 添加到内存中的联系人数组中
& strcpy(peoples[current].name, name);
& strcpy(peoples[current].num, num);
//7.2 current 进行自增1
& current++;
//7.3 将联系人信息写入到文件
写入文件操作
& writToFile();
& & printf("添加联系人完毕
//删除联系人
//思路: 让用户输入序号
来确定要删除那个联系人&
& & 删除数组中这个指定联系人的信息
同时 更新文件
//1.展示联系人列表
//2.提示用户输入序号
//3.接收这个序号
//4.简单容错
//5.提示用户是否确定删除
//6.接收用户的选择
//7.根据用户的选择执行
删除数组元素的操作
//8.更新文件
& //1.展示联系人列表
& & showP();
& //2.提示用户输入序号
& printf("请输入要删除的联系人的序号
& //3.接收这个序号
& & scanf("%d",&ser);
& //4.简单容错
(ser &&span style="font-variant-ligatures:
no-common- color: #272ad8"&0 || ser &= current)
& printf("没有该序号
功能执行完毕 \n");
& //5.提示用户是否确定删除
& printf("是否确定删除
0(取消)\n");
& //6.接收用户的选择
& & scanf("%d",&flag);
(flag == 1)
(ser & current) {
i = i& current-1;
& peoples[i] = peoples[i+1];
& current--;
& //8.更新文件
& writToFile();
& & printf("删除联系人完毕
//修改联系人
让用户输入新联系人信息&
& 拿着这个新联系人信息 根据用户输入的 序号 去修改
联系人数组中指定的位置&
并更新文件
& //1.展示联系人列表
& & showP();
& //2.请输入要修改的联系人的
& & printf("请输入联系人的序号
& //3.接收这个序号
serial =-1;
& & scanf("%d",&serial);
& //简单容错
(serial &&span style="font-variant-ligatures:
no-common- color: #272ad8"&0 || serial&=current)
printf("呵呵呵
咱们没有这个人&
你回去吧\n");
& //4.提示用户输入新的名字
& printf("请输入联系人的新名字:(请不要带空格)\n");
& //5.接收这个新的名字
name[NAME_LEN];
& & scanf("%s",name);
& //6.提示用户输入新的电话号
& printf("请输入联系人的新号码:(请不要输入空格)\n");
& //7.接收新的电话号
num[NUM_LEN];
& & scanf("%s",num);
& //是否确认修改
& printf("确定修改吗
? 1(确定)&
& & scanf("%d",&flag);
//8.根据用户输入的序号找到数组的指定位置
& strcpy(peoples[serial].name, name);
& strcpy(peoples[serial].num, num);
& //9.更新文件
& writToFile();
& & printf("修改联系人完毕
& & showP();
//展示联系人
//1.提示执行展示联系人操作
//2.打印表头
//3.遍历联系人列表
---& 结构体数组
& //1.提示执行展示联系人操作
& & printf("执行展示联系人操作\n");
& //2.打印表头
& printf("序号\t\t\t\t姓名\t\t\t\t号码\t\t\t\t\t\n");
& //3.遍历联系人列表
---& 结构体数组
i & i++) {
& printf("%d\t\t\t\t%s\t\t\t\t%s\n",i,peoples[i].name,peoples[i].num);
& & printf("展示联系人完毕
//搜索联系人
//让用户输入联系人的名字
拿着这个名字遍历 联系人数组 一旦找到跟名字一样的 打印联系人的号码.
如果没有找到说没有改联系人
//1.给用户提示
输入联系人的名字
//2.接收用户输入的名字
//3.遍历结构体数组
查找是否有该名字 如果有 打印联系人的号码
//4.如果没有
给一个提示
searchP(){
& //1.给用户提示
输入联系人的名字
& printf("请输入联系人的名字:(名字请不到带空格
& //2.接收用户输入的名字
name[NAME_LEN];
& & scanf("%s",name);
& //3.遍历结构体数组
查找是否有该名字 如果有 打印联系人的号码
i & i++) {
//判断用户输入的名字
与我们联系人的名字是否一样
& if(strcmp(name,
peoples[i].name) == 0){
printf("%s的
电话号码是 %s
\n",name,peoples[i].num);
& & printf("没有找到
& //4.如果没有
给一个提示
& & printf("搜索联系人完毕
//展示功能列表
showTitle(){
printf("**************************\n");
& printf("****** 欢迎使用通讯录
******\n");
& printf("****** 1、添加联系人&
******\n");
& printf("****** 2、删除联系人&
******\n");
& printf("****** 3、修改联系人&
******\n");
& printf("****** 4、展示所有联系人
& printf("****** 5、搜索联系人&
******\n");
& printf("****** 6、退出系统&
& ******\n");
printf("**************************\n\n");
//写入文件操作的实现
writToFile(){
& //1.引入头文件
& //2.定义文件指针&
& & FILE *fp = fopen(MYFILENAME,
(fp != NULL)
& //3.操作文件
//把数组中所有的数据都写入到文件中保持文件的完整性
& fwrite(&current, sizeof(int),
i & i++) {
fwrite(&peoples[i], sizeof(struct
Person), 1,
& & }else{
& printf("文件打开失败&
嘿嘿 \n");
& //4.关闭文件
& & fclose(fp);
& & printf("写入文件&
以上代码,因当前学习的局限性,所以不能做的和市面上的通讯录一种效果,但是确实是简单的实现了.嘻嘻,希望在黑马的日里面能够学到更多的东东,把自己学到的思想分享出来~~~
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。未来属于我们当中那些仍然愿意弄脏双手的少数分子!
C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存对齐的问题。也就是内存里面会有空档。
1.结构体的定义和赋值&
结构体是可以直接初始化的,在定义的时候,就可以初始化,而且如果你的结构体中恰好有字符数组的话,这个时候初始化是不错的选择,原因很简单,字符数组只能定义的时候直接初始化
后来就不可以了,后来你就只能用strcpy函数来拷贝初始化了。
struct 结构体名 {
数据类型   成员名1;
数据类型   成员名2;
数据类型   成员名n; };
&2.定义结构体变量的俩种方法:
struct 结构体名 {
成员列表; }变量名1;
struct 结构体名 变量名2;
&访问结构体成员 结构体变量名.成员名
3.结构体初始化操作
结构体名 变量名={初始数据表};
无名结构体 没有类型名。 一般状态下:无名结构体不可以定义局部变量。
4.结构体嵌套
1--- 成员所属的数据类型是 结构体类型
2--- 内部的结构体通常定义为无名结构体
5.结构体数组
1--- 本质是数组,元素是结构体类型。定义了一堆结构体。
阅读(...) 评论()C语言 结构体数组详解及示例代码
转载 &更新时间:日 09:41:04 & 投稿:lqh
本文主要介绍C语言 结构体数组,这里整理了相关资料及简单示例代码,以便大家学习参考,有兴趣的小伙伴可以看下
所谓结构体数组,是指数组中的每个元素都是一个结构体。在实际应用中,结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。
定义结构体数组和定义结构体变量的方式类似,请看下面的例子:
struct stu{
char * //姓名
//所在小组
}class[5];
表示一个班级有5个学生。
结构体数组在定义的同时也可以初始化,例如:
struct stu{
char * //姓名
//所在小组
}class[5] = {
{"Li ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"He fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
当对数组中全部元素赋值时,也可不给出数组长度,例如:
struct stu{
char * //姓名
//所在小组
}class[] = {
{"Li ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"He fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
结构体数组的使用也很简单,例如,获取 Wang ming 的成绩:
修改 Li ping 的学习小组:
class[0].group = 'B';
【示例】计算全班学生的总成绩、平均成绩和以及 140 分以下的人数。
#include &stdio.h&
char * //姓名
//所在小组
}class[] = {
{"Li ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"He fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
int main(){
int i, num_140 = 0;
float average, sum = 0;
for(i=0; i&5; i++){
sum += class[i].
if(class[i].score & 140) num_140++;
printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);
运行结果:
sum=707.50
average=141.50
以上就是对C语言结构体数组的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 结构体数组定义和使用 的文章

 

随机推荐