【问题标题】:How do I print center aligned string in C [duplicate]如何在 C 中打印居中对齐的字符串 [重复]
【发布时间】:2013-10-29 20:19:44
【问题描述】:

谁能帮我打印与 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。

提前谢谢你

【问题讨论】:

  • 您忘记了第二个 printf 格式说明符中的小 s
  • 感谢 0xF1 的建议编辑。

标签: c printf centering stdio


【解决方案1】:

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】:

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

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

    值得注意的是,除非space_for_string - strlen(string) 是偶数,否则您将不得不选择要将字符串转移到的位置。

    无论如何,您确实想使用 "%*s"specifier,但您输入宽度字段的数字不能像平面 20 那样简单。

    相反,您想喂它空间宽度的一半加上字符串宽度的一半

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

    【讨论】:

    • 感谢威廉·托特兰的回答
    【解决方案3】:

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

    【讨论】:

    • +1 用火箭筒杀死苍蝇:P
    • @AlterMann:更像是一种战术热核装置。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      看看我的小库:libTprint,代码很简单,你应该能理解它是如何对齐文本的。

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 2020-09-05
        • 2015-02-03
        • 1970-01-01
        • 2016-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-19
        相关资源
        最近更新 更多