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