我在C中编写了一个程序,它在UNIX中具有与ls, ls-l, ls-a
相同的功能。现在我想要做的是以与原始ls相同的方式打印数据(在具有1个空格距离的列中)。我知道在制作列时我需要使用printf("%*s",size,string)
,但列大小取决于列中最长的单词。我怎么能这么简单?我唯一的想法是,首先,收集某些结构中的所有数据,然后检查最长的元素并将长度保存到变量,该变量将是列的大小。
答案 0 :(得分:0)
我刚刚在GNU coreutils中查找了它是如何做到的,这基本上就是这样做的。
当算法一次只打印一行时,有一个极端情况:你要求每行一个条目,进行非递归搜索,要求不对条目进行排序,你没有明确地告诉ls使用一定的块大小。
在其他所有情况下,它基本上都是你指定的。 对于结构,我建议你有一些结构,你有点慷慨地分配,如果你用完了,就会以指数方式重新分配。如果您遇到内存不足或者您从一开始就想要节省内存,您仍然可以将您已经拥有的内容转储到屏幕上。
小附录coreutils ls甚至不使用%* s,而是使用putchars空格(我猜想可以与古代/破坏的libcs一起使用),但两者都应该有效。
至于问题,如果您有兴趣,请浏览http://www.artfiles.org/gnu.org/coreutils/coreutils-8.20.tar.xz