\ t中考虑了多少个空格

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

大多数终端程序将在每第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输出helloscanf从标准输入读取的参数个数,如果你输入两个,则为2,然后选项卡,然后右手printf已完成输出并返回“7”表示它打印了多少个字符,由左侧printf打印。 我希望有一个标签可以带你到屏幕上的第9列,这表示在7之前有两个空格,你的问题在于你正在观察1.显然你的终端工作有点不同,可能考虑到8号,16号,第24个等列是制表位。

更多关于标签

\t 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通常意味着您的源代码缩进是制表符和空格的混合,以达到所需的左手-column:用天真的光标移动实现导航是一种麻烦。 许多人喜欢设置“按下选项卡时插入空格”选项,因此文件始终与实际空间一起保存,并且可以使用各种显示/打印软件更加可预测地显示。

在C99和C11中,

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

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

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

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

                 1 ------- ------- 2 3 -------
你好\ tworld helloTttworld
 \ thelloworld Tttttttthelloworld
你好\ t \ tworld helloTttTtttttttworld

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