C语言学生数据库结构体数组显示异常问题求助
问题分析与解决方案
核心问题1:数组索引错误
在displayStudents的循环中,你始终使用currentEntries作为数组下标,而非循环变量i。currentEntries代表已添加的学生总数,数组有效索引范围是0到currentEntries-1,访问listOfStudents[currentEntries]会指向未初始化的内存区域,这就是输出空字符串和0值的直接原因。
核心问题2:输入缓冲区残留换行
main函数中执行scanf("%d", &selection)后,输入缓冲区会遗留一个换行符。后续addNewStudents中的第一个scanf("%[^\n]s", name)会直接读取这个换行符,导致姓名被读为空字符串。
次要问题:打印格式不匹配表头
原打印语句未按照表头的列布局输出,缺少序号、分隔符和换行,导致输出混乱。
修复后的完整代码片段
1. 修复displayStudents函数
void displayStudents() { printf("\t\tList of Student Information\n"); printf("-----------------------------------------------------------\n"); printf("|No.| \t\t\t Name \t\t\t |\t Major \t\t| GPA |\n"); printf("-----------------------------------------------------------\n"); int i; for (i = 0; i < currentEntries; i++) { // 使用循环变量i作为索引,按表头格式对齐输出 printf("|%2d | %-25s | %-15s | %.2f |\n", i+1, listOfStudents[i].name, listOfStudents[i].major, listOfStudents[i].gpa); } printf("-----------------------------------------------------------\n"); }
2. 修复addNewStudents函数的输入问题
void addNewStudents() { char name[100]; char major[100]; float gpa; if (currentEntries >= 20) { // 改为>=,避免数组越界 printf("Database is full\n"); return; } printf("\t\t Insert Student Information \n"); printf("-----------------------------------------------------------------------\n"); // 清除输入缓冲区的残留换行 getchar(); printf("Name: \t "); scanf("%[^\n]s", name); printf("\nMajor\t: "); scanf(" %[^\n]s", major); printf("\nGPA\t: "); scanf(" %f", &gpa); listOfStudents[currentEntries] = createNewStudent(name, gpa, major); currentEntries++; }
额外优化点
- 将
addNewStudents中的判断条件currentEntries > 20改为currentEntries >= 20,因为数组最大容量为20,索引范围是0-19,当currentEntries等于20时已无剩余空间。 - 打印GPA时使用
%.2f保留两位小数,更符合实际成绩展示需求。 - 用
%-25s、%-15s等格式化符号实现左对齐,让输出排版更整齐。
内容的提问来源于stack exchange,提问作者k12293139
相关产品推荐
相关产品推荐

