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

如何在C语言中实现数据的整齐对齐输出?

问题描述

尝试用C语言输出整齐的数据行,使用\t制表符后输出对齐不一致,当前输出效果:

Location City Price Rooms Bathrooms Carpark Type Furnish
Mont-Kiara Kuala-Lumpur 1000000 2 2 0 Built-up Partly
Cheras Kuala-Lumpur 310000 3 2 0 Built-up Partly

当前使用的代码:

#include <stdio.h>
#include <string.h>

struct data_struct {
    char location[150];
    char city[150];
    long long int prices;
    int rooms;
    int bathroom;
    int carpark;
    char type[150];
    char furnish[150];
} data[5000];

void data_read(FILE *file) {
    char location[150];
    char city[150];
    long long int prices;
    int rooms;
    int bathroom;
    int carpark;
    char type[150];
    char furnish[150];
    
    char header[1000];
    fscanf(file, "%[^\n]\n", header);
    int i = 0;
    while(fscanf(file, "%[^,],%[^,],%lld,%d,%d,%d,%[^,],%[^\n]\n", location, city, &prices, &rooms, &bathroom, &carpark, type, furnish) == 8) {
        strcpy(data[i].location, location);
        strcpy(data[i].city, city);
        data[i].prices = prices;
        data[i].rooms = rooms;
        data[i].bathroom = bathroom;
        data[i].carpark = carpark;
        strcpy(data[i].type, type);
        strcpy(data[i].furnish, furnish);
        i = i + 1;
    }
}

void display_data(int row) {
    printf("Location \t City \t\t Price \t Rooms \t Bathrooms \t Carpark \t Type \t Furnish\n");
    for(int i = 0; i < row; i++) {
        printf("%s \t %s \t %lld \t %d \t %d \t %d \t %s \t %s\n", data[i].location, data[i].city, data[i].prices, data[i].rooms, data[i].bathroom, data[i].carpark, data[i].type, data[i].furnish);
    }
}

int main() {
    FILE *file = fopen("file(in).csv", "r");
    data_read(file);
        
    int t;
    scanf("%d", &t);

    display_data(t);
        
    return 0;
}    

希望实现如下整齐的无框输出:

Location City Prices Rooms Bathrooms Carpark Type Furnish
Mont-Kiara Kuala-Lumpur 1000000 2 2 0 Built-up Partly
Cheras Kuala-Lumpur 310000 3 2 0 Built-up Partly

解决方案

制表符\t的对齐依赖终端制表位设置,不同长度文本会导致错位,正确做法是使用printf格式化宽度控制,为每个字段指定固定输出宽度,结合左/右对齐实现整齐排版。

修改display_data函数如下:

void display_data(int row) {
    // 为每个字段指定宽度,文本类用左对齐,数值类可按需选择左/右对齐
    printf("%-15s %-15s %-10s %-6s %-10s %-8s %-10s %s\n", 
           "Location", "City", "Prices", "Rooms", "Bathrooms", "Carpark", "Type", "Furnish");
    for(int i = 0; i < row; i++) {
        printf("%-15s %-15s %-10lld %-6d %-10d %-8d %-10s %s\n", 
               data[i].location, data[i].city, data[i].prices, 
               data[i].rooms, data[i].bathroom, data[i].carpark, 
               data[i].type, data[i].furnish);
    }
}

格式说明:

  • %-15s:左对齐输出字符串,占用15个字符宽度,不足部分用空格填充
  • %-10lld:左对齐输出长整型数值,占用10个字符宽度(若希望数值右对齐,去掉-即可,如%10lld)
  • 可根据实际数据的最大长度调整字段宽度,比如City字段最长为"Kuala-Lumpur"(12字符),设置15宽度足够留出间隙;数值类字段根据最大数值位数调整,百万级价格用10宽度足够

修改后每个字段固定占用指定宽度,无需依赖制表符即可实现整齐对齐的输出效果。

内容的提问来源于stack exchange,提问作者Aleph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:35:59