汇总一下printf()的相关用法,并给出示例。
详情参见:printf(3)
使用printf()必须include <stdio.h>
printf()的功能主要是按格式化要求在终端控制台中打印出相应的字符。其返回值int表明当前执行的printf()总共打印出多少字符。当printf执行出错时,返回的结果是个负数。

1
2
3
4
5
6
7
// c code
int count = printf("Hello world.");
printf("\ncount=%d\n", count);

// output
Hello world.
count=12

#printf()操作字符串的可以有:

  1. 字符串的左、右对齐
  2. 字符串打印长度的设置
  3. 字符串填充符的前后设定
  4. ‘char’与数字的相互转换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    // 正常的打印字符串
printf("%s|end\n", "test123");
// 设定打印的%s字符串长度最小值为10,长度不足10时默认在字符串的左边填充' '空格。
printf("%10s|end\n", "test123");
// 设定打印的%s字符串长度最小值为10,长度不足10时默认在字符串的右边填充' '空格。
printf("%-10s|end\n", "test123");
// 设定打印的%s字符串长度最小值为10,长度不足10时默认在字符串的左边填充'0'空格。
printf("%010s|end\n", "test123");
// 打印出ASCII码表中数字所代表的字符
printf("%c%c%c%c%c %d %d %d %d %d.\n", 72, 101, 108, 108, 111, 'H', 'e', 'l', 'l', 'o');
// output
test123|end
test123|end
test123 |end
000test123|end
Hello 72 101 108 108 111.

以上的示例中,不存在%-010s这样’-‘与’0’共存的设置,当两者都出现时,编译器会自动忽略掉’0’而只让’-‘生效。

#设置字符串最小长度的另一种方法

1
2
3
4
5
6
7
8
9
10
11
12
// d表示普通的十进制数字。打印出宽度为5的数字21。即左边填充3个空格。
// %*代表第后续的第1个参数值是宽度设定的最小值
printf("%*d\n", 5, 21);
// 同上。 ‘%’由‘%m$’代替,‘*’由'*n$'代替
printf("%2$*1$d\n", 5, 21);
// 同上。 ‘%’由‘%m$’代替,‘*’由'*n$'代替
printf("%1$*2$d\n", 21, 5);

// output
21
21
21

#操作数字的功能有:

  1. 设定数字的输出进制表达式
    o:八进制
    d:十进制
    u:无符号数的十进制
    x:十六进制(字母部分大写)
    X:十六进制(字母部分小写))

    1
    2
    3
        printf("%o %d %u %d %x %X\n", 123, 123, -123, -123, 123, 123);
    // output
    173 123 4294967173 -123 7b 7B
  2. 操作数字打印的长度及精度

  3. 操作数字打印的左、右对齐方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
        // %f默认小数点后6位数
    printf("%f|end\n", 12.3);
    // %f默认小数点后2位数
    printf("%.2f|end\n", 12.3);
    // %f默认小数点后2位数,打印的字符串长度最小值为6,不足的个数用' '填充在左边
    printf("%6.2f|end\n", 12.3);
    // %f默认小数点后2位数,打印的字符串长度最小值为6,不足的个数用' '填充在左边
    printf("% 6.2f|end\n", 12.3);
    // %f默认小数点后2位数,打印的字符串长度最小值为6,不足的个数用'0'填充在左边
    printf("%06.2f|end\n", 12.3);
    // %f默认小数点后2位数,打印的字符串长度最小值为6,不足的个数用' '填充在右边
    printf("%-6.2f|end\n", 12.3);
    // output
    12.300000|end
    12.30|end
    12.30|end
    12.30|end
    012.30|end
    12.30 |end

以上的示例中,不存在%-06f这样’-‘与’0’共存的设置,当两者都出现时,编译器会自动忽略掉’0’而只让’-‘生效。

#打印科学计数法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    // 默认小数点后6位,e小写
printf("%e \n", 1.23f);
// 默认小数点后6位,E大写
printf("%E \n", 1.23f);
// 设置小数点后2位,总长度最小值为10,不足默认用‘ ’空格在左边填充,E大写
printf("%10.2E|end \n", 1.23f);
// 设置小数点后2位,总长度最小值为10,不足默认用‘ ’空格在左边填充,E大写
printf("% 10.2E|end \n", 1.23f);
// 设置小数点后2位,总长度最小值为10,不足默认用‘0’在左边填充,E大写
printf("%010.2E|end \n", 1.23f);
// 设置小数点后2位,总长度最小值为10,不足默认用‘ ’空格在右边填充,E大写
printf("%-10.2E|end \n", 1.23f);
// output
1.230000e+00
1.230000E+00
1.23E+00|end
1.23E+00|end
001.23E+00|end
1.23E+00 |end

#%G与%f、%e的区别
%g 使用%e或%f中较短的一个
%G 使用%E或%f中较短的一个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    double a=1000000000;
double b=123.456;
printf("%e\n",a);
printf("%f\n",a);
printf("min.length is :%g\n",a);
printf("%e\n",b);
printf("%f\n",b);
printf("min.length is :%g\n",b);
// output
1.000000e+09
1000000000.000000
min.length is :1e+09
1.234560e+02
123.456000
min.length is :123.456

#打印一个指针指向的地址

1
2
3
4
5
    char * p = &"test string";
// 输出字符串,打印出指针的指向的地址信息
printf("%p|end\n", p);
// output
0x100000f78|end

#只输出一个%

1
2
3
printf("%%");
// output
%