【问题标题】:How to print a list of strings to a file in a table format?如何以表格格式将字符串列表打印到文件中?
【发布时间】:2016-01-15 15:14:54
【问题描述】:

我有一个固定大小的数组: library[BOOKNUM]

数组中的每一项都是struct book

结构手册

typedef struct _book{

    char name[NAME_LENGTH];
    char authors[AUTHORS_NAME_LENGTH];
    char publisher[PUBLISHER_NAME_LENGTH];
    char genre[GENRE_LENGTH];
    int year;
    int num_pages;
    int copies;
}book;

我的目标是打印这样的文件列表:

Name                    Author                Publisher                     Genre ...
War and Remembrance     Herman Wouk           Good Books Publishing, LtD    Historic Novel 
Zzz, from A to Z        Noam Chomsky          Bad Books Publishing, LtD     Linguistics
Splitting the Atom      Margaret Openheimer   Science Books Publishing, inc Nuclear Physics

所有书籍和所有属性等等。

我尝试将\t 放在属性之间,没有用。

我尝试在每个属性之间打印 (30-len(attribute))* 空格,没有用。

有人有建议吗?

【问题讨论】:

  • 你应该展示你尝试过的东西。再次阅读printf() 的规范(我假设您已经阅读过一次)。指定字段宽度和左对齐很容易;如果需要,您甚至可以截断过长的字符串。
  • SO 不是代码编写网站。也不要因为你的作业而问答案。
  • @AshishAhuja 编辑帖子时请不要使用斜体the。它几乎从不具有语法意义。此外,code 高亮显示的是实际语言关键字、常量、名称等。“属性”既不是 C 关键字也不是上述代码中的名称,将其格式化为 attribute 会造成混淆并损害可读性。
  • @PaulRoub,感谢您告诉我。我马上改。我不会再犯同样的错误了。
  • 请查看@Rabbid76 的答案或我的答案。它们对我来说确实很好用。

标签: c formatting


【解决方案1】:

printf( "%-30s", str ); 打印 str 并在末尾用空格填充字符串,最多 30 个字符。 printf( "%-*s", len, str ); 打印 str 并在字符串末尾填充空格,最多为 len 个字符。

这是一个打印struct book 字符串的函数。每列都有一个固定的长度:

print_book( book *b )
{
    printf( "%-*s", NAME_LENGTH, book->name);
    printf( "%-*s", AUTHORS_NAME_LENGTH, book->authors);
    printf( "%-*s", PUBLISHER_NAME_LENGTH, book->publisher);
    printf( "%-*s", GENRE_LENGTH, book->genre);
}

类似功能打印到文件:

fprint_book( FILE *f, book *b )
{
    fprintf( f, "%-*s", NAME_LENGTH, book->name);
    fprintf( f, "%-*s", AUTHORS_NAME_LENGTH, book->authors);
    fprintf( f, "%-*s", PUBLISHER_NAME_LENGTH, book->publisher);
    fprintf( f, "%-*s", GENRE_LENGTH, book->genre);
}

【讨论】:

  • 还不如用OP的NAME_LENGTH换成namelen
  • +1 并不是真正需要的,因为char name[NAME_LENGTH] 最多可以打印NAME_LENGTH-1 字符,使用"%-*s", NAME_LENGTH, book->name); 将确保前导空格。但这是一个小问题,是解决 OP 问题的正确方法。
【解决方案2】:

使用printf时可以格式化字符串来指定长度。

例如:

//prints out a c string that takes up 20 spaces
printf("%20s", str);            

// printing multiple c strings
printf("%20s%25s", str1, str2); 

确保为您的字符串指定的空格数(在第一种情况下为 20),您永远不会超过。

【讨论】:

    【解决方案3】:

    如果您知道每列的最大长度(看起来确实如此),您只需检查要打印的值有多长(例如,如果 NAME 是 25 个字符并且列的最大长度是30)、剩余5个不用的字符可以用空格填充,不用担心缩进。

    不过,printf() 有非常有用的方法来定义最大宽度。 例如,

    printf("%-15s\n", "Hello, world!"); 
    

    语句打印字符串,但打印 15 个字符。如果字符串较小,“空”位置将被“空格”填充。

    查看here 获取一些有用的示例。

    【讨论】:

    • 我正在使用 fprintf() 打印到文件中。效果一样吗?
    猜你喜欢
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    相关资源
    最近更新 更多