如何在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

