在显示输出信息时,由于输出信息不定,可能会引起输出的显示很混乱。
现在有一种解决思路:
1、获得终端的大小,行宽度。
2、计算所有输出信息长度的最大值。
3、计算每行显示条目的个数,并设置每个条目占用的空间(按最大长度加2个空格)。
下面示例是按上面思路写的。
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include "errno.h"
static int get_screen_width(int *pColum)
{//get terminal's width
struct winsize size;
if(isatty(STDOUT_FILENO)==0)
{
printf("not a tty\n");
return -1;
}
if(ioctl(STDOUT_FILENO, TIOCGWINSZ, &size)<0)
{
printf("get win size failed: %s\n", strerror(errno));
return -1;
}
*pColum = size.ws_col;
return 0;
}
int printf_list(int col_width, char **pTabl)
{//list info with specified indent
int max_len = 0;
int i = 0;
int one_line_items = 0;
if (pTabl == NULL)
{
return -1;
}
while (pTabl[i] != NULL)
{
if (max_len < strlen(pTabl[i]))
{
max_len = strlen(pTabl[i]);
}
i++;
}
one_line_items = col_width/(max_len+4);
i = 0;
while (pTabl[i] != NULL)
{
printf("%-*s", max_len+4, pTabl[i]);
if ((i+1) % one_line_items == 0)
{
printf("\n");
}
i++;
}
printf("\n");
return 0;
}
int main(vodi)
{
int col_width = 0;
char *buf[] = {
"a",
"aa",
"aaa",
"aaaa",
"aaaaa",
"aaaaaa",
"aaaaa",
"aaaa",
"aaa",
"aa",
"a",
NULL
};
get_screen_width(&col_width);
printf_list(col_width, buf);
return 0;
}
效果如下:
如果终端尺寸较大时如果终端尺寸较小时: