C语言中水平制表符 \t 与退格键 \b 的使用方法探索

宁睿  金牌会员 | 2024-8-14 22:34:42 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 948|帖子 948|积分 2854

经个人实践,C语言中使用转义序列码(\t)会输出一个 8 个格数的组合,当 \t 之前的内容达到 8 * n 格时,后续内容出现在 8 * (n + 1) + 1 格。(式中 n >= 1,且为整数)
探索过程如下:
第一次在看到某大佬的科普中提到:
\b将输出位置左移一位
\t表示一个tab的间隔即1个大空格,相当于4个小空格
上述代码的明白:
  \t\b\t\b 表示前进四个空格然后回退一个空格,做两次雷同操纵,于是数字1会定位到数字7对应的位置下方。
  \t\t\b\b 表示前进两个大空格然后再回退两个大空格,即将\t看成一个tab的效果,回退的是两个tab,所以最后回到最初位置,也就是数字0对应的位置下方。

  • 但可能是文章时间久远,中心规范发生了变化,现在在个人的尝试下未能重现,代码如下:
  1. int main() {
  2.     printf("1234567890123456789012345678901234567890\n");  //参考格数个位用
  3.     printf("0        1         2         3         4\n");  //参考格数十位用
  4.     printf("\t\ba\n");
  5.     printf("\t\b\t\ba\n");
  6.     printf("\t\b\t\b\t\ba\n");
  7.     printf("\t\b\t\b\t\b\t\ba\n");
  8.     printf("\t\t\b\b1\n");
  9.     printf("\t\t\t\b\b\b1\n");
  10.     printf("\t\t\t\t\b\b\b\b1\n");
  11.     printf("\t\t\t\t\t\b\b\b\b\b1\n");
  12.     printf("0        1         2         3         4\n");  //参考格数十位用
  13.     printf("1234567890123456789012345678901234567890\n");  //参考格数个位用
  14.     return 0;
  15. }
复制代码
得到的结果是:
  1. 1234567890123456789012345678901234567890
  2. 0        1         2         3         4
  3.        a
  4.        a
  5.        a
  6.        a
  7.               1
  8.                      1
  9.                             1
  10.                                    1
  11. 0        1         2         3         4
  12. 1234567890123456789012345678901234567890
复制代码
结果中无论一行中 \t\b 出现几次,内容 a 终会出现在第 8 格,而类 \t\t\b\b 的代码则会使内容 a 出现在 8 + 7 * n 格。结果明显不符合预期之后怀疑是 \t 可能会在与其它转义序列码组适时发生变化,或者是可能会与前面内容的长度(格数)有关。

  • 首先考虑是 \t 可能会在与其它转义序列码组适时发生变化,因此进行了组合尝试,代码如下:
  1. int main() {
  2.     printf("12345678901234567890\n");
  3.     printf("0        1         2\n");
  4.     printf("\ta\n");
  5.     printf("\ba\n");
  6.     printf("\t\ba\n");
  7.     printf("1234\t\ba\n");
  8.     printf("12\b34\t\ba\n");
  9.     printf("12\b34\ta\n");
  10.     printf("12\a34\t\ba\n");
  11.     printf("12\b\a34\t\ba\n");
  12.     printf("12\a\b34\t\ba\n");
  13.     printf("0        1         2\n");
  14.     printf("12345678901234567890\n");
  15.     return 0;
  16. }
复制代码
得到的结果是:
  1. 12345678901234567890
  2. 0        1         2
  3.         a
  4. a
  5.        a
  6. 1234   a
  7. 134    a
  8. 134     a
  9. 1234   a
  10. 134    a
  11. 134    a
  12. 0        1         2
  13. 12345678901234567890
复制代码
结果中如果不受 \t 后的转义序列码影响,内容 a 终会出现在第 8 格。因此可知,\t 后的内容并不会受到前面一部分的转义序列码影响。

  • 既然前面猜想错误,那么就可能会与前面内容的长度(格数)有关,因此咋去除了一般 \t 前后的 \b 后进行了长度测试,代码如下:
  1. int main() {
  2.     printf("12345678901234567890\n");
  3.     printf("0        1         2\n");
  4.     printf("123456\ta\n");
  5.     printf("1234567\ta\n");
  6.     printf("12345678\ta\n");
  7.     printf("123456789\ta\n");
  8.     printf("1234567890\ta\n");
  9.     printf("123456789012345\ta\n");
  10.     printf("1234567890123456\ta\n");
  11.     printf("1234567890\ta12\tb\n");
  12.     printf("1234567890\t\b\b\b\b\b\b\ba12\tb\n");
  13.     printf("1234567890\t\b\b\b\b\b\b\b\b\b\ba12\tb\n");
  14.     printf("1234567890\b\b\b\ba12\tb\n");
  15.     printf("0        1         2         3\n");
  16.     printf("123456789012345678901234567890\n");
  17.     return 0;
  18. }
复制代码
结果如下:
  1. 12345678901234567890
  2. 0        1         2
  3. 123456  a
  4. 1234567 a
  5. 12345678        a
  6. 123456789       a
  7. 1234567890      a
  8. 123456789012345 a
  9. 1234567890123456        a
  10. 1234567890      a12     b
  11. 123456789a12    b
  12. 123456a120      b
  13. 123456a120      b
  14. 0        1         2         3
  15. 123456789012345678901234567890
复制代码
结果中可以发现,当第一个 \t 前的内容少于 7 格时,内容 a 总会出现在第 9 格;当第一个 \t 前的内容大于等于 8 格小于等于 15 格时内容 a 会出现在第 17 格,因此可以类比得出:\t 会输出一个 8 个格数的组合,当 \t 之前的内容达到 8 * n 格时,后续内容出现在 8 * (n + 1) + 1 格。
同时,根据最后三例结果:
  1. 123456789a12    b
  2. 123456a120      b
  3. 123456a120      b
复制代码
可以得出:\b 会删去该序列组合左侧的空格,遇到非空格的内容会对该格进行覆盖占用,并在继续向左占用后恢复右侧未占用格中的内容。
探索仍在继续,过程可能出现错误,如能指出则万分感谢!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表