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

C语言中如何修复电影数据表格化输出的列对齐问题?

修复电影数据打印的列对齐问题

看起来你遇到的问题主要来自两个地方:错误的文件读取逻辑和不可靠的制表符对齐方式。咱们一步步解决:

问题分析

  1. 读取逻辑错误:你的输入文件里数据是用空格分隔的(比如1 Toy Story 1995),但代码里用了%[^\t](匹配直到制表符的内容),这会把整行内容都塞进MID字段,导致后续的电影名称、年份完全读错,输出自然混乱。
  2. 制表符对齐不可靠:\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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:17:45