printf \ t选项

时间:2011-07-11 05:19:21

标签: c printf

当您使用C中的printf将标签字符打印到标准输出时,它会输出一些明显长度为4个字符的空格。

printf("\t");

在上述情况下,有什么办法可以控制标签宽度吗?任何帮助或建议表示赞赏。

4 个答案:

答案 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