1.前言
如果只是为了答案可以跳转至2.3总结篇。
也许有人好奇,为什么我突然发关于\t的相关问题呢?
其实事情是这样的,我在牛客网上刷编程入门初学者训练的题目,恰巧碰到这么一道题目。
1.1题目
描述
学生信息管理系统是学校教学管理的重要工具,现有一名学生基本信息如下:姓名-Jack,年龄-18,性别-Man,请按照输出样例的格式输出该学生的信息。
输入描述:
无
输出描述:输出分为三行,分别为标题行,分隔行,信息行。
第一行,标题行,每个标题之间间隔4个空格。
第二行,分隔行,一共21个减号"-"。
第三行,信息行,每列输出信息和标题首字母对齐。输出样例如下:
Name Age Gender
---------------------
Jack 18 man
1.2 我的代码
-
#include <stdio.h>
-
int main()
-
{
-
printf("Name\tAge\tGender\n");
-
printf("---------------------\n");//直接复制的
-
printf("Jack\t18 \tman\n");
-
return 0;
-
}
我本以为肯定能通过的,然而事与愿违,我提交代码后是这样的情况。
1.3 自我反思
\t不是一般默认为4个空格输出吗?按道理来说源代码应该没问题?
2.利用例子探寻'\t'的空格数量
首先,大家都知道\t是制表符,相当于我们电脑键盘上的Tab键,默认为4个或者8个字符,但是实际情况并不是这样的。
2.1例子(分开)
提示(和8位数相差1)
①样例1
-
printf("1234567\t123456\t12345\n");
-
printf("----------------------\n");
②样例2
-
printf("12345\t1234\t123\n");
-
printf("----------------------\n");
③样例3
-
printf("123456789\t1234567\t\n");
-
printf("----------------------\n");
④样例4
-
printf("123456781234567\t1234\t\n");
-
printf("--------------------------\n");
⑤样例5
-
printf("123456789\t1234567890\t123\n");
-
printf("-----------------------------------\n");
2.2例子(汇总)
#include <stdio.h>
int main()
{
printf("1234567\t123456\t12345\n");
printf("----------------------\n");
printf("12345\t1234\t123\n");
printf("----------------------\n");
printf("123456789\t1234567\t\n");
printf("----------------------\n");
printf("123456781234567\t1234\t\n");
printf("--------------------------\n");
printf("123456789\t1234567890\t123\n");
printf("-----------------------------------\n");
return 0;
}
输出:
2.3总结
通过上述例子我们可以发
现,\t的空格数量并不是随机的,而是每8个字符串自动补齐。如果超过8个字符,就以最接近8的倍数补齐。
解释:
例子1中字符串为“1234567”,可以看出,后面加了制表符后,打印输出只有1个空格。(7+1=8)
例子2中字符串为“12345”,可以看出,后面加了制表符后,打印输出有3个空格。(5+3=8)
例子3中字符串为“123456789”,可以看出,后面加了制表符后,打印输出有7个空格。(9+7=16%8=0)
例子3中字符串为“123456781234567”,可以看出,后面加了制表符后,打印输出有1个空格。
(15+1=16%8=0)
因此,\t的空格数应为|8-x (含有的字符数) - | % 8,逢8补齐。