0

我用 C 语言编写了一个与 UNIX 具有相同功能ls, ls-l, ls-a的程序。现在我想要做的是以与原始 ls 相同的方式打印数据(在具有 1 个空间距离的列中)。我知道在制作列时我需要使用 a printf("%*s",size,string),但列的大小取决于列中最长的单词。我怎么能简单呢?我唯一的想法是首先,以某种结构收集所有数据,然后检查最长的元素并将长度保存到一个变量中,该变量将是列的大小。

4

1 回答 1

0

我刚刚在 GNU coreutils 中查看了它是如何做到的,这基本上就是这样做的方式。

当算法一次只打印一行时,存在一种极端情况:您要求每行输入一个条目,进行非递归搜索,要求不对条目进行排序并且您没有明确告诉 ls 使用某个块大小。

在其他所有情况下,它基本上都会执行您指定的操作。对于结构,我建议您分配一些结构数组,如果您用完,您会以指数方式重新分配。如果您遇到内存不足,或者如果您从一开始就决定要节省内存,您仍然可以将到目前为止您已经拥有的内容转储到屏幕上。

coreutils ls 的小附录甚至不使用 %*s,而是使用 putchars 空格(我猜是为了使用古老/损坏的 libcs​​ 的可移植性),但两者都应该工作。

至于这个问题,如果你有兴趣,看看http://www.artfiles.org/gnu.org/coreutils/coreutils-8.20.tar.xz

于 2012-12-17T20:39:44.517 回答