我确实设法到达水平线(行)到中心但不是垂直。 请帮助,我仍然是一个菜鸟,所以如果你能解释你的代码,那将非常感激。
谢谢
#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;
}
答案 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::left
或std::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
}
}
}