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

如何在C中打印居中对齐的字符串,c,printf,centering,stdio,C,Printf,Centering,Stdio,有人能帮我打印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

有人能帮我打印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


提前谢谢

使用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
            , ' '
    );
}

对于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
            , ' '
    );
}

一般来说,您可能希望避免使用居中对齐的文本,尤其是在控制台上,但无论如何;这需要一些努力

printf不知道如何开始的(可能的)原因是它不是一个完全确定的操作;并非所有字符串都可以在所有空间中居中

值得注意的是,除非
space\u for_string-strlen(string)
是一个偶数,否则您必须选择要将字符串移动到的位置

在任何情况下,您都希望使用
“%*s”
说明符,但输入宽度字段的数字不能像平面
20
那么简单

相反,您希望将空间的一半宽度加上字符串的一半宽度提供给它


一般来说,您可能希望避免使用居中对齐的文本,尤其是在控制台上,但无论如何;这需要一些努力

printf不知道如何开始的(可能的)原因是它不是一个完全确定的操作;并非所有字符串都可以在所有空间中居中

值得注意的是,除非
space\u for_string-strlen(string)
是一个偶数,否则您必须选择要将字符串移动到的位置

在任何情况下,您都希望使用
“%*s”
说明符,但输入宽度字段的数字不能像平面
20
那么简单

相反,您希望将空间的一半宽度加上字符串的一半宽度提供给它


若您在linux上工作,那个么您可以使用该库到达终端中的一行中心并打印文本

如果您在linux上工作,您可以使用library到达终端中一行的中心并打印文本

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

请注意,最后一个片段是事后思考,整个答案也是如此,真的。。。无论如何

您可以,正如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;
}

请注意,最后一个片段是事后思考,整个答案也是如此,真的。。。无论如何

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


希望它能帮助你

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


希望它能帮助你

+1用于使用火箭筒杀死苍蝇:P@AlterMann:更像战术热核装置。+1用于使用火箭筒杀死苍蝇:P@AlterMann:更像是战术热核装置。您在秒
printf
格式说明符中忘记了小
s
。感谢您0xF1的建议编辑。您在秒中忘记了小
s
printf
格式说明符。感谢您0xF1的建议编辑。感谢您的回答Williham Totland谢谢您的回答Williham Totland