本文是对于 学生成绩管理系统1.0v 完成的总结,用于阶段总结和日后交流
=======================错误处理=====================
1、使用malloc()和free()遇到的错误:
【报错形式】:
*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x085b2330 ***
*** glibc detected *** ./a.out: malloc(): memory corruption: 0x085b2340 ***
【错误原因】:
使用malloc申请的内存,在使用时,写入的内存超过了内存容量,造成在free时报错
【解决办法】:
·在使用结构体数据赋值时,注意变量的强制转换,防止内存数据写入过量;
·在使用循环时,注意是否循环过度;
·【重点】在使用申请内存时,也要注意申请的大小,
如 malloc(sizeof(Node)),若 Node 是结构体,则申请的内存大小是合理
若 Node 是结构体指针(不建议),则申请内存大小是指针大小,固定4个字节
【避免方式】:数据赋值时注意【循环次数】和【数据类型】,定义结构体时,别用结构体指针,或者定义
结构体指针时,结构内部避免数据变量【区分指针变量】。
2、在 a.c 里,使用 b.c 文件内定义的结构体 pLink 时,遇到的错误:
【报错形式】:
错误: 未知的类型名‘pLink’
错误: 未知的类型名‘pLink’
【错误原因】:
在 b.h 内添加了 a.h 的头文件,导致结构体 pLink 被重复定义,最终在 a.c 内使用无效
【解决办法】:
·将 b.h 内的 a.h 注释掉
【避免方式】:在写头文件时,尽量少添加声明文件;或者另外【新建】一个【结构体定义】的声明文件。
=======================知识点总结===================
参考文档:
(https://blog.csdn.net/zxx910509/article/details/56275492/)
(https://www.cnblogs.com/kangjianwei101/p/5220021.html)
1、对文件进行读写操作:
【步骤一】:首先获取需要进行操作的文件指针,
即 FILE* fp = fopen("data/file.txt","r/r+/w/w+/a/a+");
r :只读,指针指向【文件的开头】 -> 【读文件】
r+:可读可写,指针指向【文件的开头】
w :只写(文件若存在,则清零;若不存在,则创建),指针指向【文件的开头】 -> 【写文件】
w+:可读可写,指针指向【文件的开头】
a :只写添加,指针指向【文件的结尾】 -> 【添加文件】
a+:可读可写添加,指针指向【读:文件的开头;添加:文件的结尾】
+b:【二进制模式】对【二进制文件】(区分纯文本文件,自行百度)进行操作。
【步骤二】:进行相应的文件操作
读 fgetc(fp) :一次读一个字符;区别getc(fp),getchar();
fgets(fp) :一次读一行字符;区别gets();
fscanf() :一次读一个格式字符;fscanf(fp,"%s%d",str,&d); -> 【适合数据载入】
写 fputc(fp) :一次写一个字符;区别putc(fp),putchar();
fputs(fp) :一次写一行字符;区别puts();
fprintf() :一次写一个格式字符;fprintf(fp,"%s %d\n",str,d); -> 【适合数据存储】
文件结束标志:feof用检测流上的文件结束符,其返回值有两种情况:
如果遇到文件结束,函数值为非零值,否则函数值为0
while(!feof(fp)) {} -> 【适合文件操作结束】
【步骤三】:关闭文件
fclose(fp) :-> 【适合结束文件操作,释放缓冲区】
2、对双向链表进行快速排序:
【原理】:递归,确定最左侧数据的位置,依次递归
【要点】:确定结束和递归的标志;确定链表的头尾;确定排序的头尾;
【步骤】:
传入左右端点和左端点排名,备份当前左右端点(用于结束判断);
外while:确定一个节点的位置
内while:右端左移
交换左右端节点
若左右节点相等,跳出外循环
内while:左端右移
交换左右端节点
若左右节点相等,跳出外循环
【思考】:此处使用的是节点交换,程序复杂,建议可以对 待确定位置的节点内容 进行备份,而后
的节点只需单向赋值即可,最后再把备份内容赋值到确定位置。
=======================注意点=======================
1、一个中文字符所占有的字节数为 【3个字节】;
2、对字符串数组变量进行赋值时,使用 string.h 里的 strcpy() 执行;scanf()无需这样;
3、定义字符串数组变量时,若需要8个字节,那要定义9个字节,留一个存字符串结束符;
4、做界面方法时,返回用户选择即可;各功能界面,放在各功能的方法里
=======================未解决的问题=================
1、当输入的格式(chars)与要求输入的格式(int)不一致,本次输入无效[变量值不变],并进入死循环
#include <stdio.h>
int main()
{
//[未解决]
int id = -1;
while(1)
{
scanf("%d",&id);
printf("%d",id);
}
}
执行:g
-1 -1 -1 -1 -1 -1 -1 ……(死循环)
=======================计划改进内容=====================
1、对系统文档进行【加密】:通过一种协议,在读入时解码,在写入时编码;
2、在输入密码时,输入的字符【不显示】在终端界面上;
3、实现按【任意键返回】的功能。
4、不再对退学的学生进行分数排序,不再对没有分数的同学进行排序
5、添加生日提醒
6、添加教师和学生的所属关系
原文地址:https://www.cnblogs.com/ZhongShengXueXi/p/9249814.html