Ubuntu终端中循环打印的制表符显示异常的原因是什么?
终端中制表符显示异常的原因
我在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"); }
原因解析
这是因为终端的制表符(\t)是按固定间隔的制表位来对齐的,绝大多数终端默认的制表位间隔是8个字符。
- 第一个字符串
"some string ===>"的字符总数是16,刚好是8的倍数(16=8×2),它的结尾刚好落在一个制表位上。此时后面的第一个\t会直接跳到下一个制表位,打印的数字1自然和后续数字保持整齐对齐。 - 第二个字符串
"some string===>"的字符总数是15,比8的倍数少1,结尾落在两个制表位之间。这时第一个\t会直接跳到离当前位置最近的下一个制表位,导致打印的第一个数字1的位置比第一行的第一个数字1靠左,看起来就出现了“异常”的对齐效果。
如果想让两行的列标签对齐,要么保证循环前的字符串长度是8的倍数,要么在字符串末尾补空格凑到最近的制表位,或者改用空格代替制表符手动控制对齐。
内容的提问来源于stack exchange,提问作者Noam Benson-Tilsen
相关产品推荐
相关产品推荐

