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

如何用C语言实现文本文件中数据的对齐显示?

解决C语言文本文件输出列对齐问题

我写了一段C语言代码,用来将捐赠物资相关数据写入文本文件,但输出内容无法在对应列标题下对齐。以下是我的代码、当前输出,请求帮助实现数据列对齐。

原代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
 {
    char name[5][30] = {"Contactless Thermometer","Hand Sanitizers",
                        "Face Mask", "Surgical Mask",
                            "Oxygen Mask"};
    char code[5][3] = {"CT","HS","FM","SM","OM"};
    char donator[5][15] = {"Japan","USA","China","China","Saudi Arabia"};
    int noOfShip[5] = {1,1,2,2,2};
    float qty[5] = {1.2,3.5,120,38,9};
    
    
    FILE *fptr;
    fptr = fopen("donations.txt","w");
    if(fptr == NULL)
    {
        printf("Error!");
        exit(1);
    }
   
    fprintf(fptr,"Name of Supply \t\t");
    fprintf(fptr,"Supply Code \t");
    fprintf(fptr,"Donator \t");
    fprintf(fptr,"No. of Shipment \t");
    fprintf(fptr,"Quantity Received (millions) \n");
    
    for(int i=0;i<5;i++)
    {
        fprintf(fptr,"%s \t",name[i]);
        fprintf(fptr,"%s \t",code[i]);
        fprintf(fptr,"%s \t",donator[i]);
        fprintf(fptr,"%d \t",noOfShip[i]);
        fprintf(fptr,"%.1f \n",qty[i]);
    }
    fclose(fptr);
    printf("file has been created successfully");
    return 0; 
}

当前输出

Name of Supply          Supply Code    Donator        No. of Shipment        Quantity Received (millions)
Contactless Thermometer         CT     Japan   1      1.2
Hand Sanitizers         HS      USA    1       3.5
Face Mask       FM      China   2      120.0
Surgical Mask   SM      China   2      38.0
Oxygen Mask     OM      Saudi Arabia   2       9.0

解决方案

问题根源在于用\t制表符分隔列,制表符宽度固定(通常为8字符),但不同内容长度差异会导致对齐错位。正确做法是使用格式化输出的宽度控制语法,给每列指定固定宽度,强制内容左对齐填充到对应宽度,就能实现完美对齐。

修改后的代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
 {
    char name[5][30] = {"Contactless Thermometer","Hand Sanitizers",
                        "Face Mask", "Surgical Mask",
                            "Oxygen Mask"};
    char code[5][3] = {"CT","HS","FM","SM","OM"};
    char donator[5][15] = {"Japan","USA","China","China","Saudi Arabia"};
    int noOfShip[5] = {1,1,2,2,2};
    float qty[5] = {1.2,3.5,120,38,9};
    
    
    FILE *fptr;
    fptr = fopen("donations.txt","w");
    if(fptr == NULL)
    {
        printf("Error!");
        exit(1);
    }
   
    // 用宽度控制输出标题,与数据列对应
    fprintf(fptr,"%-25s %-12s %-15s %-18s %-30s\n", 
            "Name of Supply", "Supply Code", "Donator", 
            "No. of Shipment", "Quantity Received (millions)");
    
    for(int i=0;i<5;i++)
    {
        // 对应每列宽度,-号表示左对齐
        fprintf(fptr,"%-25s %-12s %-15s %-18d %-30.1f\n", 
                name[i], code[i], donator[i], noOfShip[i], qty[i]);
    }
    fclose(fptr);
    printf("file has been created successfully");
    return 0; 
}

修改后的输出效果

Name of Supply             Supply Code   Donator          No. of Shipment       Quantity Received (millions)
Contactless Thermometer    CT            Japan            1                     1.2                         
Hand Sanitizers            HS            USA              1                     3.5                         
Face Mask                  FM            China            2                     120.0                       
Surgical Mask              SM            China            2                     38.0                        
Oxygen Mask                OM            Saudi Arabia     2                     9.0                         

格式说明

  • %-Ns:左对齐(-为左对齐标记,默认右对齐),占用N个字符宽度,字符串不足时用空格填充
  • %-Nd:针对整数类型的左对齐宽度控制
  • %-N.Mf:针对浮点数,N为总宽度,M为小数位数,左对齐填充

你可以根据实际需求调整每列的宽度数值,确保标题和数据列完全对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:18:19