基于结构体的学生信息排序后打印异常,求代码修正方案
学生信息排序代码错误修正
原代码存在的核心错误及修正方案:
- 输入循环越界:原循环
for(i=0; i <= num; i++)会多执行一次,导致数组越界,应改为for(i=0; i < num; i++)。 - 学号输入/输出格式错误:学号是字符串类型,输入时要用
%s而非%c,输出同理。且std[i].id是数组名,本身就是指针,输入时无需加&。 - 字符串比较方式错误:直接用
>比较字符串数组名是比较内存地址,不是字符串内容,需使用strcmp()函数(需引入<string.h>头文件),当strcmp(std[i].id, std[j].id) > 0时表示前者字符串更大。 - 排序交换逻辑错误:原代码仅交换了学号的第一个字符,且未同步交换入学年份,导致数据不匹配。应直接交换整个
student结构体。 - 冒泡排序结构错误:原排序循环逻辑混乱,应采用标准冒泡排序的外层轮数+内层相邻比较结构。
修正后的完整代码:
#include <stdio.h> #include <string.h> // 引入strcmp函数所需头文件 typedef struct { char id[8]; int year; } student; int main() { student std[100]; int i, j, num; student tmp; // 改为结构体类型,用于交换 printf("So sinh vien:\n"); scanf("%d", &num); printf("Nhap thong tin sinh vien:\n"); // 修正输入循环边界和格式 for(i=0; i < num; i++) { scanf("%s %d", std[i].id, &std[i].year); } // 修正冒泡排序逻辑 for(i=0; i < num-1; i++) { for (j=i+1; j < num; j++) { // 使用strcmp比较字符串内容 if (strcmp(std[i].id, std[j].id) > 0) { // 交换整个结构体,保证学号和年份同步 tmp = std[i]; std[i] = std[j]; std[j] = tmp; } } } // 修正输出格式 for(i=0; i < num; i++) { printf("%s %d\n", std[i].id, std[i].year); } return 0; }
测试验证:
输入:
3 12324521 2003 12341552 2002 12357263 2001
输出:
12324521 2003 12341552 2002 12357263 2001
内容的提问来源于stack exchange,提问作者Lok
相关产品推荐
相关产品推荐

