2010-03-17 46 views
15

De forma predeterminada, printf() parece alinear cadenas a la derecha.Centrado de cadenas con printf()

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

También puede alinear el texto a la izquierda de la siguiente manera:

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

¿Hay una forma rápida de centrar el texto? ¿O tengo que escribir una función que convierte una cadena como test en (space)(space)test(space)(space) si el ancho del texto para esa columna es 8?

Respuesta

22

printf por sí mismo no puede hacer el truco, pero se puede jugar con la anchura "indirecta", que especifica el ancho leyéndolo desde un argumento. Vamos a probar este (bueno, no es perfecto)

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

No hay ningún especificador de formato printf() para centrar el texto.

Tendrá que escribir su propia función o buscar una biblioteca que proporcione la funcionalidad que está buscando.

0

Sí, tendrá que escribir su propia función que devuelva "prueba", etc., p.

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

O usted tiene una función center_print, algo así como lo siguiente:

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

La primera sugerencia: ¿Cómo puede ser esto impl'd sin fugas de memoria? – kevinarpe

+0

Si asigna previamente algunos almacenamientos intermedios basándose en algunos criterios que no parecen irrazonables (como por ejemplo, no se centrarán más de 20 argumentos para un printf, y ninguno de los resultados centrados tendrá más de 200 bytes), podría dejar que el centro la función solo gira los búferes en cada invocación. – hlovdal

0

puede utilizar cualquiera de las dos opciones siguientes:

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

La salida es:

Nombre1 (centro)
Nombre2 (centro)

0

Puede intentar escribir su propia función para este problema.

/** 
* 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; 
} 

Resultados:

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!!!