2010-03-17 178 views
15

默认情况下,printf()似乎将字符串对齐到右侧。使用printf()对齐字符串

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

我也可以对齐文本向左这样的:

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

是否有一个快速的方法来居中文本?或者,如果该列的文本宽度是8,那么我是否必须编写一个函数将test这样的字符串转换为(space)(space)test(space)(space)

回答

22

的printf本身不能做的伎俩,但你可以用“间接”的宽度,它指定播放从参数中读取宽度。让我们试试这个(ok了,不完美)

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 2017-03-31 13:57:05

+0

如果根据一些看起来不合理的标准预先分配一些缓冲区(例如,对于一个printf不会有超过20个参数将居中,并且没有中心结果会超过200个字节),那么可以让中心函数只是在每次调用时旋转缓冲区。 – hlovdal 2017-04-02 15:18:45

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, ""); 

输出是:

名1(中心)
名称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!!!