1

任何人都可以帮助我在stringC 中打印对齐的中心吗?

例如:

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。

先感谢您

4

5 回答 5

3

stdioC库没有标准化的方法来做到这一点。您必须编写自己的代码才能通过*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
            , ' '
    );
}
于 2013-10-21T11:14:13.483 回答
3

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

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

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

在任何情况下,您确实想使用说明"%*s"符,但您输入宽度字段的数字不能像 flat 那样简单20

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

int main()
{
  int space = 20;
  char *string = "Hello";
  printf ("%*s\n", space / 2 + strlen(string) / 2,string);
}
于 2013-10-21T11:15:31.880 回答
1

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

于 2013-10-21T11:18:58.540 回答
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;
}

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

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

请注意,最后一个片段是事后才想到的,就像整个答案一样,真的......无论如何检查这个键盘以查看它的实际效果

于 2013-10-21T11:31:35.563 回答
0

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

希望对你有帮助!

于 2013-10-21T18:55:54.123 回答