\ t中考虑了多少个空格

时间:2013-06-24 06:20:24

标签: c++ c

为什么在案例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个空格。

5 个答案:

答案 0 :(得分: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)));

上面,左手 printf参数必须先准备好才能打印任何东西,这些参数包括调用的结果右手 printf。右侧printf输出hello,从标准输入读取的参数数量scanf如果您键入两个则为2,然后是标签,然后是右侧{{1} }已完成输出并返回“7”以指示它打印的字符数,由左侧printf打印。我希望有一个标签可以带你到屏幕上的第9列,这表示在7之前有两个空格,你的问题在于你正在观察1.显然你的终端工作有点不同,可能考虑到8号,16号,第24个等列是制表位。

有关标签的更多信息

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

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

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

答案 1 :(得分:6)

在C99和C11中,

  

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

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

答案 2 :(得分:6)

TAB在呈现时只有给它的空间(任何角色都是如此);然而,与制表符的一个细微差别在于它们通常被认为意味着前进到下一个“虚拟列”(我确信有一个更好的术语),其中这些虚拟列是,例如, 8个字符宽;虽然这个宽度经常可以改变。

这是一个丑陋的图形,n..-表示“虚拟列”,T..t表示标签“占用”的空间:

                1-------2-------3-------
hello\tworld    helloTttworld
\thelloworld    Tttttttthelloworld
hello\t\tworld  helloTttTtttttttworld

答案 3 :(得分:5)

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

答案 4 :(得分:0)

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

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

输出:

a12345678patil
a   pat il