The C Programming Language(第 2 版) 笔记 / 7 输入与输出 / 7.2 格式化输出(printf 函数)

本文介绍了C语言中的printf和sprintf函数,详细讲解了它们如何通过格式化字符串控制参数转换,展示了各种转换字符的用法,包括整数、浮点数、字符和字符串的输出格式。实例演示了字符串精度控制和格式说明符的灵活性。
摘要由CSDN通过智能技术生成

目录、参考文献


7.2 格式化输出(printf 函数)

输出函数 printf 将内部数值转换为字符的形式

下面只讲述该函数最典型的用法,附录 B 中给出了该函数完整的描述

int printf(char *format, arg1, arg2, ...);

函数 printf 在输出格式 format 的控制下,将其参数进行转换与格式化,并在标准输出设备上打印出来
它的返回值为打印的字符数

格式字符串包含两种类型的对象:普通字符、转换说明
在输出时,普通字符将被复制到输出流中,而转换说明并不直接输出到输出流中,而是用于控制 printf 中参数的转换和打印
每个转换说明都由一个百分号字符 % 开始,并以一个转换字符结束
在字符 % 和转换字符中间可能依次包含下列组成部分:

  1. 负号,用于指定被转换的参数按照左对齐的形式输出
  2. 数字,用于指定最小字段宽度
    转换后的参数将打印不小于最小字段宽度的字段
    如果有必要,字段左边(如果使用左对齐的方式,则为右边)多余的字符位置用空格填充以保证最小字段宽
  3. 小数点,用于将字段宽度和精度分开
  4. 数字,用于指定精度,即指定字符串中要打印的最大字符数、浮点数小数点后的位数、整型最少输出的数字数目
  5. 字母 hl,字母 h 表示将整数作为 short 类型打印,字母 l 表示将整数作为 long 类型打印

表 7-1 列出了所有的转换字符,如果 % 后面的字符不是一个转换说明,则该行为是未定义的

转换字符把参数字节数组当做什么类型来解析输出形式
d, iint十进制数
oint无符号八进制数(没有前导 0
x, Xint无符号十六进制数(没有前导 0x0X),10 ~ 15 分别用 abcdefABCDEF 表示
uunsigned int无符号十进制数
cint单个字符,码表映射
schar *顺序打印字符串中的字符,直到遇到 '\0' 或已打印了由精度指定的字符数为止
fdouble十进制小数 [-]m.dddddd,其中 d 的个数由精度指定(默认值为 6)
e, Edouble[-]m.dddddd e ±xx[-]m.dddddd E ±xx,其中 d 的个数由精度指定(默认值为 6)
g, Gdouble如果指数小于 -4 或大于等于精度,则用 %e%E 格式输出,否则用 %f 格式输出,尾部的 0 和小数点不打印
pvoid *指针(取决于具体实现)
%不转换参数打印一个百分号 %
表 7-1
printf 函数基本的转换说明

在转换说明中,宽度或精度可以用星号 * 表示,这时,宽度或精度的值通过转换参数(必须为 int 类型)来计算
例如 printf("%.*s", max, s); 从字符串 s 中打印最多 max 个字符

前面的章节中已经介绍过大部分的格式转换,但没有介绍与字符串相关的精度
下表说明了在打印字符串 "hello, world"(12 个字符)时根据不同的转换说明产生的不同结果
我们在每个字段的左边和右边加上冒号,这样可以清晰地表示出字段的宽度

%s        :hello, world:
%10s      :hello, world:
%.10s     :hello, wor:
%-10s     :hello, world:
%.15s     :hello, world:
%-15s     :hello, world   :
%15.10s   :     hello, wor:
%-15.10s  :hello, wor     :

函数 printf 使用第一个参数判断后面参数的个数及类型,如果参数的个数不够或者类型错误,则将得到错误的结果
请注意下面两个函数调用之间的区别:

printf(s); /* FAILS if s contains % */
printf("%s", s); /* SAFE */

函数 sprintf 执行的转换和函数 printf 相同,但它将输出保存到一个字符串中:

int sprintf(char *string, char *format, arg1, arg2, ...);

sprintf 函数和 printf 函数一样,按照 format 格式格式化参数序列 arg1arg2、…
但它将输出结果存放到 string 中,而不是输出到标准输出中,string 必须足够大以存放输出结果


目录、参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值