相关文章推荐
谦虚好学的口罩  ·  WindowChrome 类 ...·  2 年前    · 
有爱心的香槟  ·  Vue 中 MathJax ...·  2 年前    · 
谈吐大方的拐杖  ·  centos7 - CentOS ...·  2 年前    · 
printf 函数丨格式符号的特殊用法

printf 函数丨格式符号的特殊用法

通常我们会看到 C 语言程序运行后,会有这样的结果。

不由得感到好奇,这是怎么做到右对齐的?难道是一个一个空格敲?那这岂不是太费劲了,还要数敲了几个空格。

其实这很简单,只要在格式符号中做一点点手脚,就可以轻松实现这个效果。

1、对齐

首先就说一下,是怎么做到对齐的。

平常我们正常使用格式符号,都是从左到右输出,左边顶格也就是左对齐的方式。

那么想要右对齐,只要在百分号(%)在输出格式字符(d/f/c等)之间加一个数字,即可轻松实现。

#include<stdio.h>
int main()
  int a = 1;
  printf("%5d\n", -35);
  printf("%5d\n", 65);
  printf("%5c\n", 'A');
  printf("%5p\n", &a);
  printf("%5s\n", "你好");
  return 0;
}

运行结果:

这里的数字在格式符号中表示为宽度的意思,当输出的内容长度小于给定的宽度值,就会自动进行右对齐,左边空缺的位置用空格补上。

但当输出的内容大于给定的宽度值,例如输出内存地址,固定为 8 位,那么它就不再具备对齐的资格,该怎么输出就怎么输出。

既然可以给定的是一个数字,那我要是给一个负数,会是怎么样的呢?

#include<stdio.h>
int main()
  int a = 1;
  printf("%-5d\n", -35);
  printf("%-5d\n", 65);
  printf("%-5c\n", 'A');
  printf("%-5p\n", &a);
  printf("%-5s\n", "你好");
  return 0;
}

运行结果:

这就跟平常打印输出好像是长得一模一样,但实际不然。

正常输出,例如 -35,在屏幕上只有 -35 三个内容。但加上 -5,在屏幕上实际有 5 个位置,其余两个是用空格进行填补的。

百分号(%)加上负号(-),在 C 语言中表示为左对齐。

2、补 0

接着就是在数字面前补 0 的操作。

难道这不是你在打印输出的时候,偷摸摸地手动加上 0 么?

当然不是。首先在 C 语言中数字前面加上 0,就变成了八进制的数值常数。

例如:

int a = 0035; // 实际对应值为 29

其次,在字符串中的格式符号前添加 0,是有可能实现的。但如果要求数字前面有 100 个 0,那不是一件非常麻烦的事情吗?要是一不小心输错,就又得从头数。

但只要在格式符号中的百分号(%)后面加上一个 0,并匹配上相应的宽度,来瞧瞧结果。

#include<stdio.h>
int main()
  int a = 1;
  printf("%010d\n", -3);
  printf("%010f\n", 3.14);
  printf("%010p\n", &a);
  printf("%010c\n", 'A');
  printf("%010s\n", "你好");
  return 0;
}

运行结果:

补 0 的效果只对 %p 符号没有效果,因为该符号的输出结果固定为 8 位。

那么,我想要它左对齐,后面补 0 呢?

很可惜,目前这个在格式符号中是实现不了的。单单说 -003 和 -300 之间就有了天大的区别。

且 %-0,亦或者 %0-,都会使得格式符号的对齐、补 0 的效果失效,最后按照正常的格式符号进行输出。

3、精度

%f 和 %lf 总是会输出小数点后六位,而且一串子的 0 有时候看上去也不是那么讨喜。那么,有什么办法将其省略到后 2 位?

方法在上一篇文章中有简单地一笔带过,即使用 %.nf 格式。

该符号会对输出的小数保留到小数点后 n 位,并会自动进行四舍五入。

#include<stdio.h>
int main()
  printf("%.2f", 3.155555);
  printf("%.2lf", 6.44448);
  return 0;
}

输出结果:

那么,问题来了,该格式对浮点数类型会进行四舍五入,并保留到小数点后 n 位。如果用在其他格式符号中,会发生什么样的奇妙效果呢?

#include<stdio.h>
int main()
  int a = 1;
  printf("%010d\n", -3);