'\t' 转义序列与手动四个空格的转义序列有何不同?

How a '\t' escape sequence different than that of four spaces manually?

我用 C++ 制作矩阵,为了显示它看起来像矩阵,我使用了 for.

的嵌套循环
for (i=0; i<m; i++){
        for (j=0; j<n; j++){
            cout<<matrix[i][j]<<"\t";
        }
        cout<<"\n"; 

假设我输入矩阵的元素为 1、2、3、45、45、6,顺序为 2x3。 所以输出是

1       2       3
45      45      6

但是当我使用四个 space 而不是像这样的 \t

for (i=0; i<m; i++){
        for (j=0; j<n; j++){
            cout<<matrix[i][j]<<"    ";
        }
        cout<<"\n";

输出是

1    2    3
45    45    6

现在对我来说后一个代码确实有意义并且给出了在每个元素之后插入 4 spaces 的预期结果。 但是 \t 应该插入一个制表符 space。我看到在 1 和 2 之间有七个 space,而在 45 和 45 之间只有 6 个 space。为什么不一致?所以我只想知道选项卡 space 有何不同以及它是如何工作的?

顺便说一下,很抱歉问了这么愚蠢的问题。我刚开始接触 C++,所以不太了解基础知识。

空格和制表符在 ASCII 中有不同的表示。 <space> 是 0x20,而 <tab> 是 0x09。当程序检查当前字符时,两种可能性都需要测试。 但是它们的工作原理相同。应该是终端造成的差异。

\t(制表符)是制表符的缩写,它继承自(专业)打字机,内置制表符在某些(均匀spaced)列停止,以帮助打字员创建表格等。在某些打字机中,制表符停止位甚至可以由打字员设置。

当按下 ->| (tab) 键时,打字机的笔架将移动到这些预设停止点之一。

这是通过向输出渲染器(您的终端)发送 \t 来模拟的。

终端的常见制表符设置是让制表符每隔 8:th 个字符停止,如下所示:

--------!-------!-------!-------!-------!-------!-------!-------!-------!-------!--etc--

但是这些停止点也可以在您的终端中设置,因此作为程序员,您在使用标准 C++ 时将不知道停止点在哪里。您只需按下制表符键(发送 \t)到终端,让它找到下一个制表符停止并将回车(光标)移动到该位置。

可以通过使用 std::setw() I/O 操纵器设置下一个输出的最小宽度来补救这种缺乏控制的情况,如下例所示:

#include <iostream>
#include <iomanip>  // std::setfill, std::setw

int main() {
    std::cout << std::setfill('-'); // replace space with - as fill character

    for(int i = 0; i < 20; ++i) {
        std::cout << std::setw(3) << i;
    }
}

这不依赖于制表符设置,因为它会用 fill character 设置的任何内容填充输出之间的 space(默认情况下为 space)。

以上程序会输出:

--0--1--2--3--4--5--6--7--8--9-10-11-12-13-14-15-16-17-18-19

这里每条输出占用3个字符,中间的space用-字符填充


编辑:制表符 \t 不会(通常)实际改变输出设备上的任何视觉效果。它只是将托架(光标)的位置向右移动,直到找到第一个制表符停止位。

玩控制角色并给出这个std::cout << "hello\rH\tworld\n",让我们分解一下发生的事情:

  • hello - hello 已打印,光标现在位于第 5 列(从 0 开始)。
  • \r - 除了光标移动到第 0 列,什么都不打印。
  • H - H 打印在之前的 h.
  • 之上
  • \t - 什么都不打印,但光标移动到第一个制表位(未知列,通常为 8)
  • world - world 打印在光标恰好所在的位置。
  • \n - 组合了回车符 return 和换行符,因此光标现在将位于下一行的第 0 列。