0

为什么在案例 3 中空格数不同,结果如何受到 \t 字符的影响。

(-) 通过 (\t) 引用空格

case 1
 void main()
    {
        int a,b;
        printf("%d",printf("hello%d\t",scanf("%d%d",&a,&b)));
    }

这里的输出是>hello2-7

case 2
 void main()
    {
        int a,b;
        printf("%d",printf("hello\t%d",scanf("%d%d",&a,&b)));
    }

这里的输出是>hello-27

case 3
 void main()
    {
        int a,b;
        printf("%d",printf("\thello%d",scanf("%d%d",&a,&b)));
    }

这里的输出是>--------hello27 为什么在第三种情况下有8个空格。

4

5 回答 5

8

大多数终端程序将在每 8 列有一个制表位 - 所以我希望输出是这样确定的(我知道你的输出有点不同 - 下面讨论):

.                                column
.                                   1         2
input                      12345678901234567890
"%d",printf("hello%d\t"    hello2__7
"%d",printf("hello\t%d"    hello___27
"%d",printf("\thello%d"    ________hello27

要理解这一点,您必须了解(不必要的复杂)代码的评估顺序。检查第一printf行...

printf("%d",printf("hello%d\t",scanf("%d%d",&a,&b)));

上面,左边的参数必须在它自己打印任何东西之前准备好,这些参数包括调用右边的结果。右侧输出,从标准输入读取的参数数量,如果您键入两个,则为 2,然后是选项卡,然后右侧已完成输出并返回“7”以指示它打印了多少个字符,即打印靠左手。我希望一个选项卡将您带到屏幕上的第 9 列,这表明 7 之前有两个空格,正如您的问题所说,您正在观察 1。显然,您的终端的工作方式有点不同,可能考虑到第 8、16 列,第 24 列等为制表位。 printf printfprintfhelloscanfprintfprintf

更多关于标签

TAB 字符没有通用的解释\t...它的渲染方式取决于您使用的终端软件或渲染设备(例如 xterm、vt220、vt100 终端、MS-DOS 命令窗口、打印机、IDE、文本编辑器等.)。

一些显示/打印/格式化程序会考虑每 N 个字符有一个制表位,其中 N 通常是 8,这样如果您从第一列到第 8 列发出制表符,您将被带到第 9 列,a从第 9 列到第 16 列的选项卡将您带到第 17 列等等。但是,许多程序将有办法为选项卡放置设置任意列。像 MS Word 这样的一些程序可以使用可变宽度字体,其中制表位之间的字符数会有所不同:如果您的 C++ 程序打印一些您导入 Word 的文本,您可能会发现实际上不可能计算出需要多少个制表符才能获得所需的输出对齐方式 - 通常更容易在值之间放置一个制表符并在 Word 中更改制表位,这样看起来一切正常,或者坚持使用固定宽度的字体,例如 Courier。

C++ IDE 通常允许您为每个制表位的列设置值(上面的“N”) - 4 和 8 都是常见设置,8 通常意味着您的源代码缩进是制表符和空格的混合,以达到所需的左侧-column:使用幼稚的光标移动实现进行导航有点混乱。许多人更喜欢设置“按下制表符时插入空格”选项,以便文件始终与实际空格一起保存,并且使用各种显示/打印软件更可预测地显示。

于 2013-06-24T06:29:23.553 回答
7

一个 TAB 只有在渲染时给它的空间(实际上任何字符也是如此);但是,与制表符的一个细微区别是,它们通常被认为是前进到下一个“虚拟列”(我相信有一个更好的术语),其中这些虚拟列的宽度为 8 个字符;虽然这个宽度经常可以改变。

这是一个丑陋的图形,其中n..-表示“虚拟列”并T..t表示选项卡“占用”的空间:

                1--------2--------3--------
你好\tworld helloTttworld
\thelloworld Ttttttthelloworld
你好\t\tworld helloTttTtttttttworld
于 2013-06-24T06:28:36.297 回答
6

在 C99 和 C11 中,

\t ( 水平制表符 ) 将活动位置移动到当前行的下一个水平制表位置。如果活动位置位于或超过最后定义的水平制表位置,则显示设备的行为未指定。

而 C++03 和 C++11 没有指定 '\t' 与 C 的区别。

于 2013-06-24T06:27:08.940 回答
5

\t不包含任何空格。\t 是一个可以以不同长度显示的正确字符,但它只有一个字符。

于 2013-06-24T06:23:40.513 回答
0

根据编译器和计算机软件的宽度将更改为 4 位或 8 位例如:这是在 windows 10 pro 上使用编译器 gcc 6.3 编译器编译的 c 程序,其中宽度为 4 位,

#include <stdio.h>
int main(void) {
printf("a12345678patil\n");
printf("a\tpat\til");
}

输出:

a12345678patil
a   pat il
于 2021-01-12T10:14:45.673 回答