Может ли кто-нибудь помочь мне в печати 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 , код очень прост, и вы должны понимать, как он выравнивает тексты.
Надеюсь, это поможет вам!