Центрирование строк с printf()

по умолчанию printf() Кажется, выравнивает строки вправо.

printf("%10s %20s %20sn", "col1", "col2", "col3");
/*       col1                 col2                 col3 */

Я также могу выровнять текст слева следующим образом:

printf("%-10s %-20s %-20s", "col1", "col2", "col3");

есть ли быстрый способ центрировать текст? Или мне нужно написать функцию, которая поворачивает строку как test на (space)(space)test(space)(space) если ширина текстового столбца 8?

5 ответов


printf сам по себе не может сделать трюк, но вы можете играть с "косвенной" шириной, которая определяет ширину, читая ее из аргумента. Давайте попробуем это (хорошо, не идеально)

void f(char *s)
{
        printf("---%*s%*s---\n",10+strlen(s)/2,s,10-strlen(s)/2,"");
}
int main(int argc, char **argv)
{
        f("uno");
        f("quattro");
        return 0;
}

нет printf() спецификатор формата для центрирования текста.

вам нужно будет написать свою собственную функцию или найти библиотеку, которая предоставляет функциональность, которую вы ищете.


да, вам придется либо писать свою собственную функцию, которая возвращает "тест" и т. д., Например,

printf("%s %s %s", center("col1", 10), center("col2", 20), center("col3", 20));

или у вас есть функция center_print, что-то вроде следующего:

void center_print(const char *s, int width)
{
        int length = strlen(s);
        int i;
        for (i=0; i<=(width-length)/2; i++) {
                fputs(" ", stdout);
        }
        fputs(s, stdout);
        i += length;
        for (; i<=width; i++) {
                fputs(" ", stdout);
        }
}

Вы можете использовать любой из следующих двух вариантов:

char name[] = "Name1";

//Option One
printf("%*s", 40+strlen(name)/2, name, 40-strlen(name)/2, "");
puts("");//skip one line
//Option two
printf("%*s", 40+strlen("Name2")/2, "Name2", 40-strlen("Name2")/2, "");

выход:

Name1 (центр)
Name2 (center)


можно попробовать написать собственную функцию для этой проблемы.

/**
 * Returns a sting "str" centered in string of a length width "new_length".
 * Padding is done using the specified fill character "placeholder".
 */
char *
str_center(char str[], unsigned int new_length, char placeholder)
{
    size_t str_length = strlen(str);

    // if a new length is less or equal length of the original string, returns the original string
    if (new_length <= str_length)
        return str;

    char *buffer;
    unsigned int i, total_rest_length;

    buffer = malloc(sizeof(char) * new_length);

    // length of a wrapper of the original string
    total_rest_length = new_length - str_length;

    // write a prefix to buffer
    i = 0;
    while (i < (total_rest_length / 2)) {
        buffer[i] = placeholder;
        ++i;
    }
    buffer[i + 1] = '';

    // write the original string
    strcat(buffer, str);

    // write a postfix to the buffer
    i += str_length;
    while (i < new_length) {
        buffer[i] = placeholder;
        ++i;
    }
    buffer[i + 1] = '';

    return buffer;
}

результаты:

puts(str_center("A", 0, '-')); // A
puts(str_center("A", 1, '-')); // A
puts(str_center("A", 10, '-')); // ----A-----
puts(str_center("text", 10, '*')); // ***text***
puts(str_center("The C programming language", 26, '!')); // The C programming language
puts(str_center("The C programming language", 27, '!')); // The C programming language!
puts(str_center("The C programming language", 28, '!')); // !The C programming language!
puts(str_center("The C programming language", 29, '!')); // !The C programming language!!
puts(str_center("The C programming language", 30, '!')); // !!The C programming language!!
puts(str_center("The C programming language", 31, '!')); // !!The C programming language!!!