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
相关产品推荐
相关产品推荐

