printf () Заполнение для столбцов в C - PullRequest
0 голосов
/ 30 октября 2019

У меня есть программа на C, которая печатает информацию о файлах в текущем каталоге. Это более конкретная версия ls. У меня возникли проблемы с разделением столбцов одним пробелом. Моя функция выглядит следующим образом:

    while ( (sd = readdir(dir)) != NULL) {
    lstat(sd->d_name, &sfile);

    printf("%hu", sfile.st_mode);

    printf("%d", sfile.st_nlink);

    pwd = getpwuid(sfile.st_uid);
    printf("%s", pwd->pw_name);

    grp = getgrgid(sfile.st_gid);
    printf("%s", grp->gr_name);

    printf("%lld", sfile.st_size);

    t = sfile.st_mtime;
    tmp = localtime(&t);
    strftime(MY_TIME, sizeof(MY_TIME), "%Y-%m-%d %H:%M", tmp);
    printf("%s", MY_TIME);

    printf("%s\n", sd->d_name);

Я пытался добавить% -1s в операторы printf, но это только вызывает ошибку сегмента. Если кто-нибудь может мне помочь, это было бы очень признательно. Спасибо.

Я не могу просто добавить пробелы, потому что столбцы не будут выровнены, если у вас есть, например, номер ссылки на файл> 10 в одном столбце и однозначный номер ссылки в следующем.

Current output:
16877  5  bobmichaels  staff  160  2019-10-30 09:54
16832  23  bobmichaels  staff  736  2019-10-29 22:24

Desired output:
16877  5   bobmichaels  staff  160  2019-10-30 09:54
16832  23  bobmichaels  staff  736  2019-10-29 22:24

Ответы [ 3 ]

3 голосов
/ 30 октября 2019

Почему бы просто не добавить пробел после каждого вывода самостоятельно? Очень просто, если вы объедините все маленькие вызовы printf в один вызов, который печатает все:

printf("%hu %d %s %s %lld %s %s\n",
       sfile.st_mode, sfile.st_nlink, pwd->pw_name, grp->gr_name, sfile.st_size, MY_TIME, sd->d_name);

Если вы хотите указывать определенную ширину каждого столбца, используйте спецификатор ширины поля *Формат 1006 *, например

printf("%-4hu %-5d %10s %10s %lld %10s %s\n",
       sfile.st_mode, sfile.st_nlink, pwd->pw_name, grp->gr_name, sfile.st_size, MY_TIME, sd->d_name);

[Обратите внимание, что приведенные выше значения ширины поля составляют всего примеры , экспериментируйте, чтобы получить желаемую ширину]


И наконец, обратите внимание, что вы никогда не сможете получить столбцы для выравнивания в 100% случаев, рано или поздно вы получите некоторые данные, которые слишком длинны, чтобы соответствовать ширине, которую вы определили. Лучшее решение - проверить, насколько оно распространено, и, если оно распространено, отрегулировать ширину, но в остальном действительно не нужно беспокоиться.

1 голос
/ 30 октября 2019

Если я правильно понял, почему бы просто не вставить пробел в printf, например:

printf(" %s");

, если вы хотите напечатать столбец длиной 10 с выравниванием по правому краю:

printf("%10s");

если вы хотите напечатать столбец длиной 10, выровняйте по левому краю:

printf("%-10s");

столбцы будут дополнены пробелами, если столбец больше 10, будет выдвигать другие столбцы.

0 голосов
/ 30 октября 2019

если вы хотите, чтобы они были разделены пробелами, просто добавьте пробел после "% lld" или перед следующим, если вы хотите, чтобы все были оправданы, добавьте \ t

...