C语言printf函数详解

本文已整合到C语言标准库深度解读

printf

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”,fPI3.1415927410float一般只有6位精度
“%.10f”,dPI3.1415926536double可保证15位精度
“%010.5f”,dPI0003.141595位精度,10个字符,左侧补0
“%015.5E”,dPI*1e50003.14159E+005width指字符个数
“%#010.0f”,dPI*1e5000314159.**#**强制输出小数点
“%+f”,dPI+3.141593**+**强制输出正号
“%.2G”,dPI3.1
“%.2G”,dPI*1e103.1E+010此时显然E模式更短
“%010.2G\n%010.4G”,dPI00000003.1
000003.142
默认右对齐
“%-010.2G\n%-010.4G”,dPI3.1
3.142
**-**模式下左对齐,所以0没了

整型测试

printf输出说明
%u,IPI31415926作为无符号整型输出
%+d,IPI31415926+模式强制显示正号
%o,IPI167657166输出为8进制
%x,IPI1df5e76输出为十六进制
%#X,IPI0X1DF5E76#模式下显示0X

stdio中,定义了一系列printf函数和scanf函数,通过在前面添加一个字母来表示不同的行为:

输出位置使用参数列表读取输入
标准输出(屏幕)printfvprintfscanf
streamfprintfvfprintffscanf
字符串sprintfvsprintfsscanf

为了便于阅读,下面默认

#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, ...)
  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值