2010-03-17 2 views
15

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

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

Я могу также выровнять текст влево, как это:

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

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

ответ

22

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; 
} 
2

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

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

0

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

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); 
     } 
} 
+0

Первое предложение: Как это может быть impl'd без утечки памяти? – kevinarpe

+0

Если вы предварительно распределите некоторые буферы на основе некоторых критериев, которые не кажутся необоснованными (например, не более 20 аргументов будут центрированы для одного printf, и ни один из центрированных результатов не будет длиннее 200 байтов), вы можете позволить центру функция просто вращает буферы при каждом вызове. – hlovdal

0

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

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 (центр)
Наименование2 (в центре)

0

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

/** 
* 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] = '\0'; 

    // 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] = '\0'; 

    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!!! 
Смежные вопросы