2010-03-17 8 views
15

Par défaut, printf() semble aligner les chaînes vers la droite.Centrage des chaînes avec printf()

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

Je peux également aligner le texte à gauche comme ceci:

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

Y at-il un moyen rapide pour centrer le texte? Ou dois-je écrire une fonction qui transforme une chaîne comme test en (space)(space)test(space)(space) si la largeur du texte pour cette colonne est 8?

Répondre

22

printf par lui-même ne peut pas faire l'affaire, mais vous pouvez jouer avec la largeur « indirecte », qui précise la largeur en le lisant à partir d'un argument. Laissent essayer (ok, pas parfait)

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

Il n'y a pas de spécificateur de format printf() pour centrer le texte.

Vous aurez besoin d'écrire votre propre fonction ou de trouver une bibliothèque qui offre les fonctionnalités que vous recherchez.

0

Oui, vous devrez soit écrire votre propre fonction qui renvoie "test" etc., par ex.

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

Ou vous avez une fonction center_print, quelque chose comme ce qui suit:

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 première suggestion: Comment cela peut-il être impl'd sans fuite de mémoire? – kevinarpe

+0

Si vous préférez pré-allouer des tampons basés sur des critères qui ne paraissent pas déraisonnables (par exemple, pas plus de 20 arguments seront centrés pour un printf, et aucun des résultats centrés ne dépassera 200 octets), vous pouvez laisser le centre fonction juste rotation des tampons sur chaque invocation. – hlovdal

0

Vous pouvez utiliser l'une des deux options suivantes:

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 sortie est:

Name1 (centre
Nom2 (centre)

0

Vous pouvez essayer d'écrire une fonction propre pour ce problème.

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

Résultats:

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