You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于结构体的学生信息排序后打印异常,求代码修正方案

学生信息排序代码错误修正

原代码存在的核心错误及修正方案:

  • 输入循环越界:原循环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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:45:24