赞
踩
本文已整合到C语言标准库深度解读
printf
是绝大多数人接触的第一个C语言函数,但绝大多数人对printf
的认识也就到了hello world
为止了,很多人甚至看不懂这个函数的声明:
int printf(const char *format, ...)
关键是字符串格式比较复杂,可以表示为%[flags][width][.precision]specifier
例如
#include<stdio.h>
#define PI 3.14159265358979323846264338327950288
int main(){
printf("%6.2f",PI);
return 0;
}
其输出为
E:\Documents\00\1110>a.exe
3.14
其中,%6.2f
可分为3部分,6
表示输出六个字符;.2
表示保留2位小数;f
表示输出的是浮点数。由于PI
在保留2
位小数之后,只有4
个字符,所以在3.14
左侧补上了空格。
各参数的取值与含义可见于下表,如果觉得不够直观,可直接跳到测试部分。
specifier 格式化符号 | |
---|---|
整数 | 〖%d 〗〖%i 〗〖无符号%u 〗 |
无符号不同进制 | 〖八进制%o 〗〖十六进制%x 〗〖大写十六进制%X 〗 |
浮点数 | 〖%f 〗〖科学计数法%e , %E 〗〖%g 用%f 和%e 中较短的那个〗 |
字符和字符串 | 〖字符%c 〗〖字符串%s 〗 |
指针 | %p 输出指针地址 |
其中,
i, d, o, u, x, X
可通过h
修饰,从而输出短整型;通过l
修饰,从而输出长整型e, E, f, g, G
可通过l
修饰,表示长双精度型,但在Windows下可能没什么差别。flags 标识 | 描述 |
---|---|
- | 左对齐,默认是右对齐 |
+ | 强制显示正负号 |
# | 与 o、x、X连用时,非零值前面分别显示0、0x 或 0X 与e、E、f连用时,强制包含小数点 与g、G连用时,结果与e、E时相同,但不会移除尾部的零 |
0 | 在数字左边补充0 |
width
表示宽度,为数字时,表示输出字符的最小数目,若输出值比width
短,则用空格填充。
precision
表示精度,为.数字
时,表示写入数字的最小位数。
下面随机抽选一些表达式,列出其输出结果,事先声明一些变量
#define PI 3.14159265358979323846264338327950288
#define IPI 31415926
int main(){
float fPI = PI;
double dPI = PI;
//printf
return 0;
}
printf | 输出 | 说明 |
---|---|---|
“%.10f”,fPI | 3.1415927410 | float一般只有6位精度 |
“%.10f”,dPI | 3.1415926536 | double可保证15位精度 |
“%010.5f”,dPI | 0003.14159 | 5位精度,10个字符,左侧补0 |
“%015.5E”,dPI*1e5 | 0003.14159E+005 | width指字符个数 |
“%#010.0f”,dPI*1e5 | 000314159. | **#**强制输出小数点 |
“%+f”,dPI | +3.141593 | **+**强制输出正号 |
“%.2G”,dPI | 3.1 | |
“%.2G”,dPI*1e10 | 3.1E+010 | 此时显然E模式更短 |
“%010.2G\n%010.4G”,dPI | 00000003.1 000003.142 | 默认右对齐 |
“%-010.2G\n%-010.4G”,dPI | 3.1 3.142 | **-**模式下左对齐,所以0没了 |
printf | 输出 | 说明 |
---|---|---|
%u,IPI | 31415926 | 作为无符号整型输出 |
%+d,IPI | 31415926 | + 模式强制显示正号 |
%o,IPI | 167657166 | 输出为8进制 |
%x,IPI | 1df5e76 | 输出为十六进制 |
%#X,IPI | 0X1DF5E76 | # 模式下显示0X |
在stdio
中,定义了一系列printf
函数和scanf
函数,通过在前面添加一个字母来表示不同的行为:
输出位置 | 使用参数列表 | 读取输入 | |
---|---|---|---|
标准输出(屏幕) | printf | vprintf | scanf |
stream | fprintf | vfprintf | fscanf |
字符串 | sprintf | vsprintf | sscanf |
为了便于阅读,下面默认
#define FORMAT const char *format
其printf
族函数声明分别为
int fprintf(FILE *stream, FORMAT, ...)
int sprintf(char *str, FORMAT, ...)
int vfprintf(FILE *stream, FORMAT, va_list arg)
int vprintf(FORMAT, va_list arg)
int vsprintf(char *str, FORMAT, va_list arg)
int snprintf(char *str, size_t size, FORMAT, ...)
其中snprintf
中的size
表示要写入字符的最大数目,超过size会被截断。
scanf
族函数声明为
int fscanf(FILE *stream, FORMAT, ...)
int scanf(FORMAT, ...)
int sscanf(cSTR, FORMAT, ...)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。