一.%-8s格式分解:
- %s:这是基础占位符,告诉程序"这里要放一个字符串"
- -:这个小小的减号是个左对齐魔法师,让文字乖乖靠在左侧排列,就像学生们在操场上向左看齐
- 8:这是个空间规划师,确保每个数据都占据8个字符的宽度,不多不少
实际效果举例:如果输出"教学楼",原本长度是6个字符,使用%-8s后会变成:
cpp
教学楼
后面自动补充2个空格,凑满8位。这就好比在课程表上,每个课程名称都占据相同的格子大小,整整齐齐。
为什么要这样做?
在距离矩阵中,有些地点名称长(如"第三实验楼"),有些短(如"食堂")。如果没有统一宽度,输出会像歪歪扭扭的队伍:
cpp
体育馆 25
图书馆 30
留学生公寓 35
而用了%-8s后,就像训练有素的方阵:
cpp
体育馆 25
图书馆 30
留学生公寓 35
二.-对齐符号的奇妙用法:
左对齐-几乎适用于所有常见的格式控制场景:
Ⅰ.字符串家族:
cpp
%-8s // 字符串左对齐
Ⅱ. 整数阵营:
cpp
%-6d // 十进制整数左对齐
%-5x // 十六进制数左对齐
%-4o // 八进制数左对齐
Ⅲ.浮点数世界:
cpp
%-10.2f // 浮点数左对齐,保留2位小数
%-8.1e // 科学计数法左对齐
Ⅳ.字符领域:
cpp
%-3c // 单个字符左对齐
Ⅴ.生动对比示例:假设我们要输出学生成绩表
cpp
// 没有左对齐(默认右对齐)
printf("%8s: %3d分\n", "张三", 95);
printf("%8s: %3d分\n", "李四", 88);
// 输出效果:
// 张三: 95分
// 李四: 88分
// 使用左对齐
printf("%-8s: %-3d分\n", "张三", 95);
printf("%-8s: %-3d分\n", "李四", 88);
// 输出效果:
// 张三 : 95 分
// 李四 : 88 分
Ⅵ.实用小贴士:
- 在制作表格、对齐数据时,-就像一位细心的排版助手
- 对于数字,左对齐可能让小数点位置不统一,需要根据实际情况选择
三.中文字符占位2个字节:
从字符编码和显示原理的角度详细解释:
Ⅰ.中文占位的秘密:
编码层面的真相:
- 在GB2312/GBK中文编码中,每个汉字占用 2个字节
- 但在终端显示时,一个汉字在等宽字体下通常占据 2个英文字符的宽度
Ⅱ.实际显示效果对比:
cpp
// 让我们做个实验
printf("%-6s|\n", "教"); // "教 |"
printf("%-6s|\n", "教学"); // "教学 |"
printf("%-6s|\n", "教学楼"); // "教学楼|"
printf("%-6s|\n", "abc"); // "abc |"
printf("%-6s|\n", "abcdef"); // "abcdef|"
会发现:
- "教" → 实际显示占用2字符宽度,补齐4个空格
- "教学" → 占用4字符宽度,补齐2个空格
- "教学楼" → 刚好占满6字符宽度,无需补空格
Ⅲ.背后的设计哲学:
这其实体现了计算机对多语言支持的智慧:
- 英文字符:1字节存储,1字符宽度
- 中文字符:2字节存储,2字符宽度
- 这样保证了在表格、对齐显示时的视觉一致性
Ⅳ.举例:
cpp
int len=strlen("教学楼");
printf("%d \n",len); //结果为6
上述的例子中,要想得到"教学楼"的实际长度,就需要strlen("教学楼")/2,如下:
cpp
int len=strlen("教学楼")/2;
printf("%d \n",len); //结果为3