Как распечатать выровненную по центру строку в C

Может ли кто-нибудь помочь мне в печати string выровненной по центру в C?

Например:

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

В вышесказанном первые отпечатки Hello выровнены вправо, а второй printf – влево

  Hello Hello 

ограничивая длину для каждого до 20.

Есть ли способ распечатать Hello, выровненную по центру.

  Hello 

ограничивая общую длину до 20.

Заранее спасибо

В общем, вы, вероятно, хотите избежать выравнивания по центру текста, особенно на консоли, но в любом случае; это займет некоторое время.

Вероятность того, что printf не знает, как это сделать, заключается в том, что это не полностью детерминированная операция; не все строки могут быть центрированы во всех пространствах.

Примечательно, что если space_for_string - strlen(string) не является четным числом, вам нужно будет сделать выбор относительно того, куда вы хотите переместить строку.

В любом случае вы хотите использовать спецификатор "%*s" , но число, которое вы подаете в поле ширины, не может быть таким простым, как плоский 20 .

Вместо этого вы хотите подавать половину ширины вашего пространства плюс половину ширины вашей строки .

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

Нет стандартизированного способа сделать это с библиотекой C stdio . Вам придется написать свой собственный код, чтобы сделать это с помощью вызовов *printf или с помощью собственного printf формата printf .

Это быстрый и грязный способ сделать это:

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

Вы можете использовать библиотеку ncurses чтобы добраться до центра строки в терминале и распечатать текст, если вы работаете с Linux.

Вы могли бы, как показывает ответ Уильям Тотленд, просто вычислить требуемые пробелы и использовать printf . Поскольку я в процессе обновления моих знаний (хотя и ограничен), по управлению памятью, я пришел к следующему:

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

Использование sprintf или strncat – тоже вариант, конечно … или даже:

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

Обратите внимание, что этот последний fragment является запоздалой мыслью, как и весь ответ, действительно … в любом случае проверьте этот код, чтобы увидеть его в действии

Взгляните на мою крошечную библиотеку: libTprint , код очень прост, и вы должны понимать, как он выравнивает тексты.

Надеюсь, это поможет вам!