如何在C中打印中心对齐的字符串

时间:2013-10-21 11:07:00

标签: c printf centering stdio

任何人都可以帮我打印与C中心对齐的string吗?

例如:

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.

提前谢谢

5 个答案:

答案 0 :(得分:3)

通常,您可能希望避免居中对齐的文本,尤其是在控制台上,但无论如何;这需要做一些。

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

答案 1 :(得分:2)

使用C stdio库没有标准化的方法。您必须使用*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
            , ' '
    );
}

答案 2 :(得分:1)

如果您正在使用linux,可以使用ncurses库到达终端中心线并打印文本。

答案 3 :(得分:1)

你可以,因为Williham Totland的回答显示只计算所需的空格,并使用printf。由于我正在刷新我的知识(尽管它有限),在内存管理方面,我提出了这个:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

使用sprintfstrncat也是一种选择,当然......甚至是:

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

请注意,最后一个片段是事后的想法,整个答案也是如此,真的......无论如何...... check this codepad to see it in action

答案 4 :(得分:0)

看看我的小型库:libTprint,代码非常简单,您应该能够理解它是如何对齐文本的。

希望它可以帮到你!