我有一个包含id、年份、电影名称的文件,如下所示:
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 我把这个从文件里拿到了结构体。
现在我想把它打印出来,我对此有一个问题。
我的代码:
#include <stdio.h>
struct Movies {
char MID[50];
char MName[50];
char MYear[50];
}
Movie[100];
FILE *MovieF;
int main() {
printf("------------------\n");
printf("Disply Movies \n");
printf("------------------\n");
printf("Movie id\t\tMovie name\t\t\t\t\tYear\n");
printf("--------\t\t----------\t\t\t\t\t--------\n");
MovieF = fopen("d:\\movies.txt","r");
for(int i=0;i<60;i++) {
fscanf(MovieF, "%[^\t]\t%[^\t]\t%[^\t]\t\n",Movie[i].MID,Movie[i].MName,Movie[i].MYear);
}
for(int i=0;i<60;i++) {
printf("%s\t\t%s\t\t\t\t\t%s\n",Movie[i].MID,Movie[i].MName,Movie[i].MYear);
}
return 0;
}我不能把它印在正确的栏里。
这是当前(不需要)的输出:
------------------
Disply 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我怎样才能解决这个问题?
发布于 2020-07-09 14:43:29
我认为解决这些问题的最好办法是先看看领域。电影名称似乎是一个长度不同的字符串。通过计算最长的字符串,然后对其进行缓冲,表将看起来像预期的那样。这是我修改的代码。我计算最大长度,然后为每一个打印,找到差异,并添加了许多空格。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Movies
{
char MID[50];
char MName[50];
char MYear[50];
}Movie[100];
FILE *MovieF;
// could be more optimized, but it is a simple quick and dirty way to get max
int findmax()
{
int max = 0;
int temp = 0;
for (int i=0;i<60;i++)
{
temp = strlen(Movie[i].MName);
if (temp > max) max = temp;
}
return max;
}
int main()
{
int maxMovLen = 0;
char line[1024];
int i = 0;
printf("------------------\n");
printf("Disply Movies \n");
printf("------------------\n");
// Add your code here to read the lines from your file
// read_csv(60, 3, "movies.txt");
maxMovLen = findmax();
// chose 10 spaces as separator
printf("Movie id%*s", 10, "");
printf("Movie name%*s", maxMovLen, "");
printf("Year\n");
// chose 10 spaces as separator
printf("--------%*s", 10, "");
printf("----------%*s", maxMovLen, "");
printf("----\n");
for(int i=0;i<60;i++)
{
// chose 10 spaces as separator
printf("%4s%*s\t", Movie[i].MID, 10, "");
printf(" %s%*s\t", Movie[i].MName, maxMovLen-strlen(Movie[i].MName), "");
// chose 10 spaces as separator
printf("%10s\t\n", Movie[i].MYear);
}
return 0;
}这是运行我的代码的输出。
Disply Movies
------------------
Movie id Movie name Year
-------- ---------- ----
1 hello world people 1995
2 hello world 1995
3 hello world people2 1995
4 hello world 1995
5 hello world people3 1995
6 hello world world 1995
7 hello world5 1995
8 hello world 1995
9 hello world 1995
10 hello world 1995
11 hello world 1997
12 hello world 1999
13 hello world 2001
14 hello world 2003
15 hello world 2005
16 hello world 2007
17 hello world 2009
18 hello world 2011发布于 2020-07-09 10:49:17
不,你永远不能仅仅使用制表符来处理那种漂亮的格式。
坚持printf,您可以使用指定空间占用的%*s格式。它在字符串之前需要一个额外的数字参数。正数表示右对齐,负数表示左对齐.例如:
printf("<%*s>", 5, "abc"); // give you < abc>
printf("<%*s>", -5, "abc"); // give you <abc >发布于 2020-07-09 16:15:54
使用一组通用的最小字符宽度打印头和数据。
指定字段宽度,而不是使用选项卡@Some programmer dude。
很容易管理。
int id_width = 3*8; // Minimum widths
int name_wdith = 6*8;
int year_wdith = 1;
printf("%-*s%-*s%-*s\n",
id_width, "Movie id", name_width, "Movie name", year_width, "Year");
printf("%-*s%-*s%-*s\n",
id_width, "--------", name_width, "----------", year_width, "--------");
...
for(int i=0;i<60;i++) {
printf("%-*s%-*s%-*s\n",
id_width, Movie[i].MID, name_width, Movie[i].MName, year_width, Movie[i].MYear);https://stackoverflow.com/questions/62812996
复制相似问题