C语言如何存储二维字符串数组并横向打印学生成绩表
问题修复方案
需求回顾
需要实现的核心逻辑:
- 采集5名学生的3门科目等级成绩,成绩取值为
"A+"、"A"、"A-"这类短字符串 - 以学生序号作为行索引、科目序号作为列索引,构建二维字符串数组存储成绩
- 输入完成后,将数组内容按行横向打印为格式对齐的规范表格
原有代码的核心问题
- 循环变量
j未初始化,且所有while循环内没有更新j值的逻辑,运行后会直接进入无限死循环 - 数组维度和循环边界完全写反:要求是5行(对应5名学生)、3列(对应3门科目),原有代码循环判断条件和遍历顺序完全不符合结构要求
- 存储变量定义错误:错误使用
name一维数组存储数据,无法承载「学生-科目」的二维成绩结构 - 输入输出逻辑混乱:输入阶段没有按二维结构逐单元格采集成绩,输出阶段用
puts逐字符串打印,只能纵向输出内容,无法生成横向对齐的表格
修复后完整可运行代码
#include <stdio.h> #define STUDENT_CNT 5 // 学生总数 #define SUBJECT_CNT 3 // 科目总数 #define GRADE_LEN 4 // 成绩字符串最大长度(含结束符) int main() { // 二维成绩数组:[学生索引][科目索引] = 成绩字符串 char grades[STUDENT_CNT][SUBJECT_CNT][GRADE_LEN]; // 科目表头,可根据实际需求修改 const char* subjects[SUBJECT_CNT] = {"科目1", "科目2", "科目3"}; int i, j; // 采集成绩输入 printf("请依次输入5名学生3门科目的等级成绩(格式如A+、A、A-):\n"); for (i = 0; i < STUDENT_CNT; i++) { printf("===== 第%d名学生 =====\n", i + 1); for (j = 0; j < SUBJECT_CNT; j++) { printf("%s成绩:", subjects[j]); // 限制输入长度避免缓冲区溢出 scanf("%3s", grades[i][j]); // 清空输入缓冲区残留字符,避免异常输入影响后续读取 while(getchar() != '\n'); } } // 打印规范表格 printf("\n\n==================== 成绩表 ====================\n"); // 打印表头 printf("%-8s", "学生序号"); for (j = 0; j < SUBJECT_CNT; j++) { printf("%-8s", subjects[j]); } printf("\n------------------------------------------------\n"); // 逐行打印学生成绩 for (i = 0; i < STUDENT_CNT; i++) { printf("%-8d", i + 1); for (j = 0; j < SUBJECT_CNT; j++) { printf("%-8s", grades[i][j]); } printf("\n"); } printf("================================================\n"); return 0; }
代码说明
- 用宏定义固定学生数、科目数、成绩字符串长度,后续调整规模直接修改宏值即可
- 输入阶段严格按照「外层遍历学生、内层遍历科目」的顺序填充二维数组,加了输入缓冲区清空逻辑,避免异常输入导致的读取错乱
- 打印阶段用
%-8s/%-8d格式化占位符实现列对齐,加上边框分隔符让表格结构清晰,完全符合逐行横向输出的要求
内容的提问来源于stack exchange,提问作者user19363434
相关产品推荐
相关产品推荐

