如何在C编程中在屏幕中间打印文本?

时间:2015-02-10 22:38:49

标签: c

我确实设法到达水平线(行)到中心但不是垂直。 请帮助,我仍然是一个菜鸟,所以如果你能解释你的代码,那将非常感激。

谢谢

#include <sys/ioctl.h>
#include <stdio.h>
#include <string.h>

int main()
{

    struct winsize w; 
    ioctl(0, TIOCGWINSZ, &w); 

    int columns = w.ws_col; 
    int rows = w.ws_row;


    //printf("Lines :  %d\n", rows);
    //printf("Columns ; %d\n", columns);

    char *string = "Hello World";
    int stringLength = strlen(string) / 2;



    printf("%*s\n", columns / 2 + stringLength, string );
    //getchar();                //Pause program

    return 0;
}

5 个答案:

答案 0 :(得分:2)

不知道为什么这会被投票。似乎是一个非常有效的问题。

你已经解决了横向问题。干得好!

如果您在UNIX环境中(特别是Bash),您可以查询环境变量$LINES$COLUMNS以找出屏幕的长度和宽度。

答案 1 :(得分:1)

上次我使用了中心公式:

left_column = (width / 2) - (text/2);

所以你可以这样做:

const std::string hw = "Hello World!"; 
unsigned int spaces = (columns / 2) - (hw.length() / 2);
for (unsigned int i = 0; i < spaces; ++i)
{
  std::cout << ' ';
}
std::cout << hw << std::endl;

编辑1:
以上假定使用固定间距字体 对于可变间距字体,您需要总结所有字符宽度和间距。字符串长度是不够的。

编辑2:
另一种欺骗方式是使用std::width操纵器以及std::leftstd::right操纵器。
因此,您可以将宽度设置为空格数,然后打印出一个空格。 另请参阅std::fill

编辑3:垂直居中
垂直居中使用相同的公式:

Lines to print after = (lines in console) / 2; // Assuming your text is only 1 line. 

为了便于携带,您可以打印一半的行来清除垃圾,然后打印文本行,然后打印一半的行。

但由于控制台没有标准,特别是对于窗口系统,您必须动态获取该信息。

答案 2 :(得分:0)

使用专为此任务设计的ncurses库。 stdio不会(至少不容易)让您访问终端的功能;然后,您可以覆盖屏幕上的任意位置。

答案 3 :(得分:0)

你可以依靠这样一个事实,即屏幕右侧的文字向左滚动,这样你就可以找出要添加多少个字符,重复移动到屏幕右侧并移到屏幕右边的下一行。屏幕左侧并将其添加到您当前的计算中:

printf("%*s\n", (columns / 2 + stringLength)+((rows/2)*columns), string );

答案 4 :(得分:0)

谢谢大家的意见。我不知道为什么我的问题被投了票。我不好,如果这是一个愚蠢的问题,但这就是我们在这里的原因!?无论如何,我想出了答案,可能不是最好的但它有效:)我想,我会和你分享。顺便说一句,这是在UNIX环境中编译的。

#include <sys/ioctl.h>                                  //Use of binary forms tog et the terminal size
#include <stdio.h>
#include <string.h>

void writeScr(char *string, int rows, int cols);

int main()
{

    struct winsize w;                                   //struct winsize : will get the screensize width and height.
    ioctl(0, TIOCGWINSZ, &w);                           //TIOCGWINSZ, IOCtl to Get the WINdow SiZe.

    int columns = w.ws_col;                             //w.ws_col : number of columns from IOCTL 
    int rows = w.ws_row;                                //w.ws_row : number of rows from IOCTL


    writeScr("Hello world\n", w.ws_row, w.ws_col);


    return 0;
}

/*Functions*/

void writeScr(char *string, int rows, int cols)
{
    int vertl = rows/2;
    int hortl = 0;
    int stringLength = strlen(string) / 2;

    hortl = (cols - strlen(string))/2;                  //Calculate the center Horizontally

    for (int x = 0; x <= rows; x++)                     //For loop to print blank spaces
    {
        printf("\n");
        if (x == vertl)                                 //If x is in the middle (vertically centered), print the string
        {
            printf("\n%*s\n", cols / 2 + stringLength, string );            //Print string to the center horizontally
        }
    }
}