当您使用C中的printf
将标签字符打印到标准输出时,它会输出一些明显长度为4个字符的空格。
printf("\t");
在上述情况下,有什么办法可以控制标签宽度吗?任何帮助或建议表示赞赏。
答案 0 :(得分:45)
这是由您的终端控制的,而不是printf
。
printf
只是将\t
发送到输出流(可以是tty,文件等),它不会发送多个空格。
答案 1 :(得分:22)
标签是一个标签。它消耗的空间数是显示问题,并且取决于shell的设置。
如果要控制数据的宽度,则可以使用width
格式字符串中的printf
子说明符。例如。 :
printf("%5d", 2);
这不是一个完整的解决方案(如果值超过5个字符,它不会被截断),但可能适合您的需要。
如果您想要完全控制,您可能必须自己实施。
答案 2 :(得分:0)
这对我有用。 打印(“%s\t”,“字符串”)
答案 3 :(得分:0)
如果您的 terminal 支持正确的 ANSI escape sequences,则可以使用转义序列将 tab stops 设置为屏幕上的任何位置。转义序列 ESC [ 3 g
清除所有制表位,转义序列 ESC H
将制表位设置在特定位置。
下面是一个 POSIX 示例 C 程序,它提供了一个函数,可以将制表位设置为指定的空格数。首先删除所有现有的制表符,然后打印空格并在适当的位置设置制表位。然后光标倒回到行首。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <termios.h>
int writestr(int fd, const char *s) {
return write(fd, s, strlen(s)) == (ssize_t)strlen(s) ? 0 : -1;
}
int set_tab_stops(unsigned distance) {
assert(distance > 0);
// Using stdout here, stderr would be more reliable.
FILE *file = stdout;
const int fd = fileno(file);
// We have to flush stdout in order to use fileno.
fflush(file);
// Get terminal width.
// https://stackoverflow.com/questions/1022957/getting-terminal-width-in-c
struct winsize w = {0};
if (ioctl(fd, TIOCGWINSZ, &w) < 0) return -__LINE__;
const unsigned cols = w.ws_col;
// Remove all current tab stops.
if (writestr(fd, "\033[3g") < 0) return -__LINE__;
// Do horicontal tabs each distance spaces.
for (unsigned i = 0; i < cols; ++i) {
if (i % distance == distance - 1) {
if (writestr(fd, "\033H") < 0) return -__LINE__;
}
if (writestr(fd, " ") < 0) return -__LINE__;
}
// Clear the line and return to beginning of the line.
if (writestr(fd, "\033[1K\033[G") < 0) return -__LINE__;
return 0;
}
int main() {
set_tab_stops(10);
printf("1\t2\t3\t4\n");
set_tab_stops(5);
printf("1\t2\t3\t4\n");
}
使用 xfce4-terminal
程序输出:
1 2 3 4
1 2 3 4