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

C语言代码在VS Code正常运行,Code::Blocks输入异常求解决

解决C语言学生信息管理代码在Code::Blocks中的异常问题

问题根源

你的代码在VS Code能正常运行,但在Code::Blocks中出现要求输入大量非预期内容的问题,核心是三个原因:

  • Code::Blocks默认编译器对**变长数组(VLA)**支持不足,struct student ar[v];这类写法在部分旧版编译器中会触发未定义行为
  • 数组下标从1开始遍历,C数组默认下标从0开始,导致越界访问,不同编译器表现差异大
  • 输出字符串里的换行未用标准\n,引发格式混乱

修复后的代码

#include<stdio.h>
#include<stdlib.h> // 引入malloc/free所需的头文件

// 提前定义结构体,避免编译警告
struct student
{
    int id;
    char name[10];
    char b_g[10];
    float cgpa;
    char address[20];
};

// 调整函数参数和返回值,逻辑更清晰
void qt(int num);

int main()
{
    int num;
    printf("Input How Many students You Have: ");
    // 增加输入有效性检查,避免非法输入导致异常
    if(scanf("%d", &num) != 1 || num <= 0){
        printf("Invalid input, please enter a positive integer.\n");
        return 1;
    }
    qt(num);
    return 0;
}

void qt(int v)
{
    int n, i; // 把i改为局部变量,避免全局变量污染
    // 用malloc动态分配内存,替代变长数组,兼容所有标准C编译器
    struct student *ar = (struct student*)malloc(v * sizeof(struct student));
    if(ar == NULL){
        printf("Memory allocation failed.\n");
        return;
    }

    printf("Enter Your ID, Name, Blood Group, CGPA, Address:\n");
    // 数组下标从0开始,彻底消除越界问题
    for(i = 0; i < v; i++)
    {
        printf("Student %d info: ", i + 1);
        scanf("%d %s %s %f %s", &ar[i].id, ar[i].name, ar[i].b_g, &ar[i].cgpa, ar[i].address);
    }

    printf("\nEnter Your ID to query: ");
    scanf("%d", &n);
    int found = 0; // 标记是否找到匹配ID
    for(i = 0; i < v; i++)
    {
        if(ar[i].id == n){
            printf("\nStudent ID: %d\n", n);
            printf("Name: %s\n", ar[i].name);
            printf("Blood Group: %s\n", ar[i].b_g);
            printf("CGPA: %.2f\n", ar[i].cgpa); // 保留两位小数,输出更整洁
            printf("Address: %s\n", ar[i].address);
            found = 1;
            break; // 找到后直接退出循环,无需继续遍历
        }
    }
    if(!found){
        printf("\nStudent with ID %d not found.\n", n);
    }
    // 释放动态分配的内存,避免内存泄漏
    free(ar);
}

关键修改说明

  • 用malloc动态分配内存替代变长数组,解决Code::Blocks编译器兼容性问题,完全符合标准C规范
  • 将数组遍历下标改为从0开始,彻底消除数组越界的未定义行为
  • 增加输入有效性检查和内存分配失败判断,提升代码鲁棒性
  • 把全局变量i改为局部变量,避免全局变量引发的潜在逻辑问题
  • 优化输出格式,增加未找到学生时的提示,同时用%.2f格式化CGPA输出更美观
  • 修复了原代码中拼写错误(Adress改为Address)

内容的提问来源于stack exchange,提问作者MD. Tanvir Ahmed Akash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:55:43