【深入浅出程序设计竞赛】:printf( )

154 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 22 天,点击查看活动详情

printf()

简介:printf() 函数是在 <stdio.h> 中声明的一个函数,使用前必须加入对应的头文件 <stdio.h>,使用该函数可以向标准输出设备(如屏幕)输出数据。

printf(字符串)

首先,该函数最简单的用法就是输出字符串。

比如:

printf("Hello World!");

运行结果为:

Hello World!

printf(格式化字符串, 参数列表)

printf() 函数中,第一个参数就是格式化字符串,用于告诉计算机该如何输出,按照该字符串的需求,进行格式化输出。

比如:

printf("My age is %d.", 21);

运行结果为:

My age is 21.

可以看到,占位符 %d 表示以有符号的十进制形式输出一个整型值,此时参数列表中的 21 会代替 %d 的位置。

注意,占位符的格式可以有多个,比如:

printf("a-->%d, b-->%d", 100, 999);

运行结果为:

a-->100, b-->999

现在记录常用的占位符:

  • %d:以带符号的十进制形式输出整数(但正数不输出正号+)
  • %o:以不带符号的八进制形式输出整数
  • %x:以不带符号的十六进制形式输出整数
  • %u:以不带符号的十进制形式输出整数
  • %c:输出一个字符
  • %s:输出一个或多个字符
  • %s:输出一个或多个字符(即字符串)
  • %f:以小数形式输出单、双精度数,默认输出6位小数
  • %e:以标准指数形式输出单精度、双精度数,数字部分小数位数为 6 位
  • %lu:32位无符号整数
  • %llu:64位无符号整数

需要注意,在 printf(格式化字符串, 参数列表) 中,格式化字符串中的占位符个数必须和参数列表中参数的个数一致。

下面举一个例子:

for(int ch = 65; ch <= 90; ch++) {
    printf("ASCII: %d, 字符: %c\n", ch, ch);
}

运行结果为:

ASCII: 65, 字符: A
ASCII: 66, 字符: B
ASCII: 67, 字符: C
ASCII: 68, 字符: D
ASCII: 69, 字符: E
ASCII: 70, 字符: F
ASCII: 71, 字符: G
ASCII: 72, 字符: H
ASCII: 73, 字符: I
ASCII: 74, 字符: J
ASCII: 75, 字符: K
ASCII: 76, 字符: L
ASCII: 77, 字符: M
ASCII: 78, 字符: N
ASCII: 79, 字符: O
ASCII: 80, 字符: P
ASCII: 81, 字符: Q
ASCII: 82, 字符: R
ASCII: 83, 字符: S
ASCII: 84, 字符: T
ASCII: 85, 字符: U
ASCII: 86, 字符: V
ASCII: 87, 字符: W
ASCII: 88, 字符: X
ASCII: 89, 字符: Y
ASCII: 90, 字符: Z

再举一个例子:

#include <stdio.h>
int main()
{
    int v = 100; 
    printf("整数: %d\n" , v);
    printf("八进制值: %o\n", v);
    printf("十六进制值: %x\n", v);
    
    double fv = 123.456;
    printf("浮点数: %f \n", fv);
    
    char ch = 'A';
    printf("字符: %c\n", ch);
    
    char str[20] = "Hello World.";
    printf("字符串: %s\n" , str);
    
    return 0;
}

运行结果为:

整数: 100
八进制值: 144
十六进制值: 64
浮点数: 123.456000
字符: A
字符串: Hello World.

进一步控制格式输出

输出的宽度

我们先来看一下默认的阵型变量的输出:

printf("My age is %d.", 21);

运行结果为:

My age is 21.

现在,我们尝试把 %d 改为 %10d

printf("My age is %10d.", 21);

运行结果为:

My age is         21.

可以看到,"is"21 的距离被拉开了。这是因为这里的 10 表示我们要输出的值的字符最小数目。因为"21" 的长度为2,而指定的字符输出数为10,那么多出的宽度就由空格来填补。也就是说,如果输出的值短于该数,结果会被空格填充。

当然,如果实际要输出的值,其长度要长于我们指定的宽度,该值输出时并不会被截断。比如:

printf("The price is %5d.", 123456);

运行结果为:

The price is 123456.

另外,我们来看这种情况:

printf("My age is %-10d.", 21);

运行结果为:

My age is 21        .

可以看到,如果我们将 %10d 改为 %-10d,那么此时多出的宽度会同样以空格的形式,填补在右边而不是左边了。

输出的小数位数

我们先来看一下默认的浮点数输出:

double n = 100; 
printf("%f", n/3);

运行结果为:

33.333333

可以看到,默认是输出 6 位小数。

如果只想输出2位小数,那么可以将 %f 改为 %.2f。比如:

double n = 100; 
printf("%.2f", n/3);

运行结果为:

33.33

注意,我们可以同时输出宽度和小数位数的。比如 %5.2f 表示输出宽度为 5,并保留 2 位小数。