首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c#编程中修正表格

在c#编程中修正表格
EN

Stack Overflow用户
提问于 2020-07-09 10:38:35
回答 3查看 450关注 0票数 0

我有一个包含id、年份、电影名称的文件,如下所示:

代码语言:javascript
复制
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    

我把这个从文件里拿到了结构体。

现在我想把它打印出来,我对此有一个问题。

我的代码:

代码语言:javascript
复制
#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;
}

我不能把它印在正确的栏里。

这是当前(不需要)的输出:

代码语言:javascript
复制
------------------
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

我怎样才能解决这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-09 14:43:29

我认为解决这些问题的最好办法是先看看领域。电影名称似乎是一个长度不同的字符串。通过计算最长的字符串,然后对其进行缓冲,表将看起来像预期的那样。这是我修改的代码。我计算最大长度,然后为每一个打印,找到差异,并添加了许多空格。

代码语言:javascript
复制
    #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;
    }

这是运行我的代码的输出。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-07-09 10:49:17

不,你永远不能仅仅使用制表符来处理那种漂亮的格式。

坚持printf,您可以使用指定空间占用的%*s格式。它在字符串之前需要一个额外的数字参数。正数表示右对齐,负数表示左对齐.例如:

代码语言:javascript
复制
printf("<%*s>", 5, "abc"); // give you <  abc>
printf("<%*s>", -5, "abc"); // give you <abc  >
票数 2
EN

Stack Overflow用户

发布于 2020-07-09 16:15:54

使用一组通用的最小字符宽度打印头和数据。

指定字段宽度,而不是使用选项卡@Some programmer dude

很容易管理。

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62812996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档