如何用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
相关产品推荐
相关产品推荐

