C语言中如何修复电影数据表格化输出的列对齐问题?
修复电影数据打印的列对齐问题
看起来你遇到的问题主要来自两个地方:错误的文件读取逻辑和不可靠的制表符对齐方式。咱们一步步解决:
问题分析
- 读取逻辑错误:你的输入文件里数据是用空格分隔的(比如
1 Toy Story 1995),但代码里用了%[^\t](匹配直到制表符的内容),这会把整行内容都塞进MID字段,导致后续的电影名称、年份完全读错,输出自然混乱。 - 制表符对齐不可靠:
\t的宽度是固定的(通常8个字符),但不同长度的电影名称会让制表位错位——短名称后面的\t会跳很远,长名称可能占满多个制表位,根本没法实现整齐的列对齐。
修复方案
1. 修正数据读取逻辑
改用fgets读取整行内容,再用sscanf拆分字段,这样能正确处理带空格的电影名称。同时可以把ID和年份改成整数类型(更合理,也方便输出对齐)。
2. 用固定宽度格式化输出实现对齐
放弃\t,用printf的左对齐固定宽度格式,比如%-10d(左对齐,占10个字符宽度)、%-40s(左对齐,占40个字符宽度),确保每列都占满指定空间,不管内容长短。
完整修复代码
#include <stdio.h> #include <string.h> #include <ctype.h> struct Movies { int MID; char MName[100]; // 加长缓冲区避免长名称溢出 int MYear; } Movie[100]; FILE *MovieF; int main() { // 打印表头,用固定宽度左对齐 printf("------------------\n"); printf("Display Movies \n"); printf("------------------\n"); printf("%-10s %-40s %-10s\n", "Movie id", "Movie name", "Year"); printf("%-10s %-40s %-10s\n", "--------", "----------", "--------"); MovieF = fopen("d:\\movies.txt","r"); if (!MovieF) { // 增加文件打开失败的判断,更健壮 printf("Error: Failed to open movies.txt!\n"); return 1; } char line[200]; int count = 0; // 逐行读取文件,直到结束或满100条数据 while (fgets(line, sizeof(line), MovieF) != NULL && count < 100) { int id, year; char name[100]; // 解析每行数据:ID → 名称(含空格)→ 年份 if (sscanf(line, "%d %[^\n] %d", &id, name, &year) == 3) { // 修剪名称末尾的多余空格(因为%[^\n]会把年份前的空格读进来) char *end_ptr = name + strlen(name) - 1; while (end_ptr >= name && isspace(*end_ptr)) { *end_ptr = '\0'; end_ptr--; } // 存入结构体 Movie[count].MID = id; strcpy(Movie[count].MName, name); Movie[count].MYear = year; count++; } } fclose(MovieF); // 记得关闭文件 // 输出数据,用固定宽度左对齐 for (int i = 0; i < count; i++) { printf("%-10d %-40s %-10d\n", Movie[i].MID, Movie[i].MName, Movie[i].MYear); } return 0; }
关键细节说明
- 固定宽度格式:
%-10d表示把整数左对齐,占10个字符宽度;%-40s把字符串左对齐,占40个字符。这样不管电影名称是短是长,都会在固定位置结束,列完全对齐。 - 整行读取+解析:
fgets读取整行后,sscanf拆分字段,完美解决带空格的电影名称读取问题。 - 健壮性优化:增加了文件打开失败的判断,避免程序崩溃;修剪名称末尾的空格,让输出更整洁。
修复后输出效果
------------------ Display Movies ------------------ Movie id Movie name Year -------- ---------- -------- 1 Toy Story 1995 2 GoldenEye 1995 3 Four Rooms 1995 4 Get Shorty 1995 5 Copycat 1995 6 Shanghai Triad (Yao a yao yao dao waipo qiao) 1995
内容的提问来源于stack exchange,提问作者Pouria
相关产品推荐
相关产品推荐

