printf函数格式化输出攻略
目录
一、基本用法
二、占位符
基本用法
常用占位符
字符串占位符示例
多占位符示例
注意事项
三、占位符列表
基本数据类型占位符
浮点数占位符
特殊类型占位符
长度修饰符
使用示例
注意事项
四、输出格式
1、限定宽度
基本用法
左对齐输出
浮点数宽度限制
2、强制显示正负号
3、控制小数精度
基本精度控制
结合宽度限制
动态参数指定
4、截断字符串输出
基本用法
特点
结合宽度限定
一、基本用法
printf() 函数用于将参数文本输出到屏幕。函数名中的"f"代表"format"(格式化),表示该函数可以定制输出文本的格式。
基本语法示例:
#include <stdio.h>
int main()
{printf("Hello World");return 0;
}
上述代码会在屏幕上输出一行文字"Hello World"。
注意事项:
-
printf() 不会自动在行尾添加换行符。运行结束后,光标会停留在输出结束的位置,不会自动换行。
-
如需换行,可以在输出文本的结尾添加换行符\n:
#include <stdio.h> int main() {printf("Hello World\n");return 0; }
-
若需要在文本内部换行,同样可以通过插入换行符实现:
#include <stdio.h> int main() {printf("Hello\nWorld\n");/* 等价于 */printf("Hello\n");printf("World\n");return 0; }
重要说明:
-
printf() 函数定义在标准库头文件stdio.h中
-
使用该函数前,必须在源文件头部引入此头文件
二、占位符
printf()
函数支持在输出文本中使用占位符,这些占位符可以在运行时被具体的值替换。
基本用法
#include <stdio.h>
int main()
{printf("There are %d apples\n", 3);return 0;
}
说明:
-
There are %d apples\n
是输出文本,其中%d
是占位符。 -
占位符以百分号
%
开头,后跟一个类型标识符(如d
表示整数)。 -
printf()
的第二个参数3
会替换%d
,最终输出:There are 3 apples
常用占位符
占位符 | 类型 | 示例 |
---|---|---|
%d | 整数 | printf("%d", 10) |
%s | 字符串 | printf("%s", "abc") |
%f | 浮点数 | printf("%f", 3.14) |
%c | 单个字符 | printf("%c", 'A') |
字符串占位符示例
#include <stdio.h>
int main()
{printf("%s will come tonight\n", "zhangsan");return 0;
}
输出:zhangsan will come tonight
多占位符示例
#include <stdio.h>
int main()
{printf("%s says it is %d o'clock\n", "lisi", 21);return 0;
}
说明:
-
第一个
%s
被"lisi"
替换 -
第二个
%d
被21
替换
输出:lisi says it is 21 o'clock
注意事项
-
参数匹配规则:
-
占位符数量必须与后续参数数量严格匹配。
-
如果有
n
个占位符,printf()
需要n + 1
个参数(包括格式字符串本身)。
-
-
错误示例:此类错误可能导致未定义行为(输出乱码或程序崩溃)。
printf("%d %s", 10); // 错误:缺少第二个参数
三、占位符列表
printf()
提供多种占位符,对应不同的 C 语言数据类型。以下是常用占位符的完整参考:
基本数据类型占位符
占位符 | 类型 | 说明 | 示例 |
---|---|---|---|
%d | int | 十进制整数 | printf("%d", 10) |
%i | int | 同%d | printf("%i", 10) |
%u | unsigned int | 无符号十进制整数 | printf("%u", 10U) |
%o | int | 八进制整数 | printf("%o", 10) |
%x | int | 十六进制整数(小写) | printf("%x", 255) → ff |
%X | int | 十六进制整数(大写) | printf("%X", 255) → FF |
浮点数占位符
占位符 | 类型 | 说明 |
---|---|---|
%f | float/double | 十进制浮点数 |
%e | float/double | 科学计数法(小写e) |
%E | float/double | 科学计数法(大写E) |
%g | float/double | 自动选择%f 或%e (更简洁) |
%G | float/double | 自动选择%f 或%E |
%a | float/double | 十六进制浮点数(小写) |
%A | float/double | 十六进制浮点数(大写) |
特殊类型占位符
占位符 | 类型 | 说明 |
---|---|---|
%c | char | 单个字符 |
%s | char* | 字符串 |
%p | void* | 指针地址 |
%n | int* | 不打印,存储已输出的字符数 |
%% | - | 输出百分号字符 |
长度修饰符
可与基本占位符组合使用:
-
h
:short
(如%hd
) -
l
:long
(如%ld
) -
ll
:long long
(如%lld
) -
L
:long double
(如%Lf
) -
z
:size_t
(如%zd
)
使用示例
#include <stdio.h>int main()
{// 基本整数printf("Decimal: %d\n", 255); // 255printf("Octal: %o\n", 255); // 377printf("Hex: %x\n", 255); // ff// 浮点数printf("Float: %f\n", 3.14159); // 3.141590printf("Scientific: %e\n", 3.14159); // 3.141590e+00// 特殊类型printf("Character: %c\n", 'A'); // Aprintf("String: %s\n", "Hello"); // Helloprintf("Pointer: %p\n", main); return 0;
}
注意事项
-
类型必须严格匹配占位符
-
使用
%n
时要格外小心(可能引发安全问题) -
%%
用于输出百分号字符本身
四、输出格式
printf() 可以定制占位符的输出格式。
1、限定宽度
printf()
函数允许通过格式说明符限定输出的最小宽度。具体用法如下:
基本用法
在占位符中指定最小宽度,当输出内容不足该宽度时,默认会在左侧填充空格(右对齐)。
示例:
#include <stdio.h>
int main()
{printf("%5d\n", 123); // 输出为 " 123"(前面有2个空格)return 0;
}
说明:
-
%5d
表示该整数的输出宽度至少为5个字符 -
由于"123"只有3位,不足部分会在前面补2个空格
左对齐输出
在宽度指示符前添加-
号可以改为左对齐(右侧补空格)。
示例:
#include <stdio.h>
int main()
{printf("%-5d\n", 123); // 输出为 "123 "(后面有2个空格)return 0;
}
浮点数宽度限制
对于浮点数,宽度限制会作用于整个数字(包括整数部分、小数点和小数部分)。
示例:
#include <stdio.h>
int main()
{printf("%12f\n", 123.45); // 输出为 " 123.450000"return 0;
}
说明:
-
%12f
表示浮点数至少占用12个字符宽度 -
默认情况下,
printf()
会输出6位小数,因此实际输出为"123.450000"(共10个字符) -
不足12位,所以在前面补2个空格
注意:当实际数值的宽度超过指定的最小宽度时,会按照实际宽度输出,不会截断数据。
2、强制显示正负号
默认情况下,printf()
仅在输出负数时显示 -
号。若需强制显示正数的 +
号,可在占位符的 %
后添加 +
标志。
示例:
#include <stdio.h>
int main()
{printf("%+d\n", 12); // 输出 "+12"printf("%+d\n", -12); // 输出 "-12"return 0;
}
说明:
-
%+d
格式确保数值始终带有符号标识 -
适用于需要明确区分正负值的场景
3、控制小数精度
基本精度控制
通过 %.nf
格式可指定小数位数(n 为要保留的位数):
#include <stdio.h>
int main()
{printf("Number is %.2f\n", 0.5); // 输出 "Number is 0.50"return 0;
}
注意:
-
会自动进行四舍五入
-
不足位数补零(如
%.3f
输出 "0.500")
结合宽度限制
可同时指定宽度和精度(格式:%宽度.精度f
):
#include <stdio.h>
int main()
{printf("%6.2f\n", 0.5); // 输出 " 0.50"(头部2空格)return 0;
}
说明:
-
%6.2f
表示总宽度6字符,含2位小数 -
默认右对齐,不足宽度左侧补空格
动态参数指定
使用 *
占位符可通过参数动态设置宽度和精度:
#include <stdio.h>
int main()
{printf("%*.*f\n", 6, 2, 0.5); // 等效于 printf("%6.2f\n", 0.5)return 0;
}
特点:
-
第一个
*
对应宽度参数(示例中的6) -
第二个
*
对应精度参数(示例中的2) -
提高代码灵活性,适合需要运行时确定格式的场景
4、截断字符串输出
printf()
函数可以通过 %.ns
格式说明符来控制字符串的输出长度,其中 n
指定要显示的最大字符数。
基本用法
#include <stdio.h>
int main()
{printf("%.5s\n", "hello world"); // 输出 "hello"return 0;
}
说明:
-
%.5s
表示只输出字符串的前5个字符 -
原字符串 "hello world" 被截断为 "hello"
-
不会修改原字符串,仅控制输出内容
特点
-
安全截断:不会导致缓冲区溢出
-
精确控制:可指定任意截取长度(不超过字符串实际长度)
-
格式灵活:可与最小宽度结合使用(如
%10.5s
)
结合宽度限定
#include <stdio.h>
int main()
{printf("%10.5s\n", "hello world"); // 输出 " hello"(右对齐)printf("%-10.5s\n", "hello world"); // 输出 "hello "(左对齐)return 0;
}
注意:
-
当截取长度超过字符串实际长度时,按实际字符串长度输出
-
常用于格式化表格输出或固定长度显示场景