C语言 为什么Ubuntu终端以不同的方式显示循环打印的制表符?

vsmadaxz  于 2022-12-02  发布在  其他
关注(0)|答案(2)|浏览(126)

我正在for循环中执行printf("\t%d", i),以打印表的列标签。
在循环之前,我执行printf("some string ===>")
我注意到的一个问题是,例如,如果我执行printf("some string===>"(少一个字符),循环中的第一个选项卡在我的Ubuntu 20.04终端中不能正确显示。
这是为什么呢?

#include <stdio.h>

int main()
{
     printf("some string ===>");
     for (int j = 1; j <= 9; ++j) printf("\t%d", j);
     printf("\n");
     
     printf("some string===>");
     for (int j = 1; j <= 9; ++j) printf("\t%d", j);
     printf("\n");
}

在我的Ubuntu 20.04终端

中输出

5cg8jx4n

5cg8jx4n1#

Tab字符表示“移动到下一个制表位”,其中制表位通常每隔8个字符。
考虑以下程序:

#include <stdio.h>

int main()
{
    int i, j;
    for(i = 0; i < 16; i++) {
        for(j = 0; j < i; j++) putchar('*');
        printf("\tx\n");
    }
}

在我的计算机上(带有8个字符的制表位),它将打印:

x
*       x
**      x
***     x
****    x
*****   x
******  x
******* x
********        x
*********       x
**********      x
***********     x
************    x
*************   x
**************  x
*************** x

字符串"some string ===>"的长度为16个字符,因此打印后,字符串长度为8的倍数,因此打印TAB键会将8个空格移动到下一个8的倍数(24)。
字符串"some string===>"的长度为15个字符,因此打印后,还差一个8的倍数,因此打印TAB键时,会多移动1个空格,即16个字符。

vh0rcniy

vh0rcniy2#

使用宽度字段来对齐列,而不是使用制表符。
%-20s将使文本在20个字符宽的字段中左对齐。
%5d将在5个字符宽的字段中右对齐文本。
如果文本的长度大于指定的宽度,则字段将扩展以容纳文本。

#include <stdio.h>

int main()
{
     printf( "%-20s", "some string ===>");
     for (int j = 1; j <= 9; ++j) printf("%5d", j);
     printf("\n");

     printf( "%-20s", "some string===>");
     for (int j = 1; j <= 9; ++j) printf("%5d", j);
     printf("\n");
}

相关问题