如何格式化输出以像Linux Command ls一样打印

时间:2019-03-31 22:18:14

标签: c

我正在尝试以与系统命令ls类似的相等宽度的列来打印当前目录中的文件和文件夹的名称。列数基于终端窗口的宽度。

我知道如何获取终端尺寸,并且我已经将文件/文件夹名称排序在一个数组中。我不确定如何像下面的示例一样在等宽列中打印它们。

dirA       file2.txt  file5.txt  file8.txt
file0.txt  file3.txt  file6.txt  file9.txt
file1.txt  file4.txt  file7.txt

2 个答案:

答案 0 :(得分:1)

(printf()函数的格式)“%s”具有“限定符”。您可以在固定空间内调整字符串:

printf("'%15s'", "abc");
Print: '            abc'

printf("'%-15s'", "abc");
Print: 'abc            '

使用循环(如for(;;)),您可以打印所有元素。

答案 1 :(得分:0)

通过弄乱printf宽度说明符,我可以将列对齐。但是,如果您查看我的示例,则需要按此顺序打印。我不确定如何设置一个或多个循环来执行此操作。

/*example output

directoryA  file2  file5
directoryB  file3  file6
file1       file4  file7

*/


char  *str[] =  {"directoryA", "directoryB", "file1", "file2", file3", "file4", "file5", "file6", "file7" };

int num_files = 9;

int spaceleft = win_width;
int padding = 0;


for(int i = 0; i < num_files; i++)
{

    int space = 1;
    int padding = largest_str - strlen(str[i]);
    int next_string = strlen(str[i]) + space + padding;

    spaceleft = spaceleft - next_string;

    if(spaceleft > next_string)
    {

        printf("%-*s ",largest_str ,str[i]);
    }
    else
    {
        spaceleft = x;
        printf("\n%-*s ",largest_str, str[i]);
        spaceleft = spaceleft - next_string;
    }

}
printf("\n");