Comment imprimer une chaîne alignée au centre en C

Quelqu’un peut-il m’aider à imprimer la ssortingng alignée au centre en C?

Par exemple:

 int main() { int a = 20; char x[10] = "Hello"; char y[10] = "Hello"; printf ("%*s\n",a, x ); printf ("%-*s\n",a,y); } 

Ci-dessus, les premiers tirages Hello alignés à droite et le second printf à gauche comme ceci

  Hello Hello 

en limitant la longueur pour chacun à 20.

Y a-t-il un moyen d’imprimer Bonjour aligné au centre.

  Hello 

en limitant la longueur totale à 20.

Merci d’avance

En général, vous voulez probablement éviter le texte centré, en particulier sur une console, mais dans tous les cas; cela prendra du temps.

La raison (probable) pour laquelle printf ne sait pas comment faire cela pour commencer est que ce n’est pas une opération entièrement déterministe; toutes les chaînes ne peuvent pas être centrées dans tous les espaces.

Notamment, à moins que space_for_ssortingng - strlen(ssortingng) soit un nombre pair, vous devrez choisir où vous voulez que la chaîne soit déplacée.

Dans tous les cas, vous souhaitez utiliser le spécificateur "%*s" , mais le nombre que vous introduisez dans le champ de largeur ne peut pas être aussi simple qu’un 20 plat.

Au lieu de cela, vous voulez le nourrir avec la moitié de la largeur de votre espace et la moitié de la largeur de votre chaîne .

 int main() { int space = 20; char *ssortingng = "Hello"; printf ("%*s\n", space / 2 + strlen(ssortingng) / 2,ssortingng); } 

Il n’existe aucun moyen normalisé de procéder de la sorte avec la bibliothèque C stdio . Vous devrez écrire votre propre code pour le faire avec des appels *printf ou avec votre propre printf format printf .

C’est une façon rapide et sale de le faire:

 int main() { int a = 20; char x[] = "Hello"; int length = strlen(x); printf ("%*s%*c" ,((a - length) >> 1) + length // ssortingng length + padding spaces , x , ((a - length) >> 1) + ((a - length) & 1) // tailing spaces , ' ' ); } 

Vous pouvez utiliser la bibliothèque ncurses pour vous rendre au centre d’une ligne dans un terminal et imprimer votre texte si vous travaillez sur Linux.

Comme le montre la réponse de Williham Totland, vous pouvez simplement calculer les espaces requirejs et utiliser printf . Depuis que je suis en train d’actualiser mes connaissances (même si elles sont limitées) sur la gestion de la mémoire, j’ai proposé ceci:

 #include  #include  #include  int main() { int a = 20; char x[10] = "Hello"; char *spaces_ptr;//padding str pointer a = (a-strlen(x))/2; //allocate the required mem, calloc ensures zero terminated spaces_ptr = calloc(a + 1, sizeof(char)); memset(spaces_ptr, ' ', a);//set a chars to hold spaces //print printf("%s%s", spaces, x); free(spaces);//free memory return 0; } 

Utiliser strncat ou strncat est aussi une option, bien sûr … ou même:

 char *fullStr = calloc(strlen(x) + a + 1, sizeof(char)); memset(fullStr, ' ', a); strncpy(fullStr+a, x, strlen(x)); puts(fullStr); free(fullStr); 

Notez que ce dernier extrait est une reflection après coup, tout comme la réponse complète, vraiment … vérifiez quand même ce codepad pour le voir en action

Jetez un coup d’œil à ma minuscule bibliothèque: libTprint , le code est très simple et vous devriez être capable de comprendre comment il aligne les textes.

J’espère que ça vous aide!