本篇将重点介绍C语言的格式化输出函数 printf。当然该函数在C++程序中也可以使用。


目录

printf 函数构成及标准函数语句

格式字符种类的介绍

printf 函数的具体细节实现

格式符数量与输出表列不匹配

printf 返回值问题

格式控制符 / 附加格式控制符 的位置

其他需要注意的细节


printf 函数构成及标准函数语句

printf ( 格式控制,输出表列 )

这里格式控制指又包含了格式说明和普通字符。格式说明多用于变量,以 %+格式字符 的形式,表示按照格式输出;普通字符就按照原样输出即可。

这里要注意的是,转义符在格式控制中作为普通字符,输出的是转义符转义后的字符。(如 \x21 输出的就是感叹号 !,\n 输出的就是换行)

输出表列指真正输出的数据,这个数据可以是变量、常量,也可以是表达式或是函数等。

举个栗子:

int a=10;
printf("%dxX\n",a);

这段代码中 "%dxX\n" 就是格式控制,其中%d是一个格式说明,说明了这里要输出的一个数据的格式是十进制整数(格式字符 d 表示带符号的十进制整数,有关内容后面会重点说明),而后面的xX是两个普通字符,\n 属于普通字符表示换行。输出表列中的 a 与格式控制中的 %d 对应,所以在 %d 位置的实际输出就是这个 a 表示的数字10

最终输出为:

10xX

(还有一个空行)

格式字符种类的介绍

格式字符分为两种基本格式字符和附加格式字符。基本格式字符如下表:

d,i 带符号的十进制形式整数(符号带-,整数不带+)
o 八进制无符号形式输出整数(不带前导0,因为只输出最基本的内容)
x,X 十六进制无符号形式输出整数(不带前导0x)
u 十进制无符号形式输出整数
c 字符形式输出(一个字符)
s 输出一个字符串

f

以小数形式输出浮点数
e,E 以指数形式输出浮点数(科学计数法)
g,G 在 f , e 中选择宽度较短的形式输出浮点数

可以用以下代码加以验证:

int m = 10;
printf("%d %o %x %u\n", m, m, m, m);
//输出:10 12 a 10
double b = 3.1415;
printf("%f %e %g\n", b, b,b);
//输出:3.141500 3.141500e+00 3.1415
char s[] = "abcd";
char c = '*';
printf("%s %c\n", s, c);
//输出:abcd *

除此以外,printf 函数还具有一些附加格式字符,具体如下表:

字母 l d/o/x/u 前,表示长整型整数
字母 h d/o/x/u 前,表示短整型整数

正整数 m

设置输出数据的宽度
正整数 .n

浮点数:n位小数

字符串:前n个字符

输出左对齐(默认为右对齐)

我们可以对上一段代码加以修饰,查看结果:

int a = 10;
printf("%d %-5o %x %u\n", a, a, a, a);
//输出:10 12    a 10
double b = 3.1415;
printf("%.2f %.3e %g\n", b, b,b);
//输出:3.14 3.142e+00 3.1415
char s[] = "abcd";
char c = '*';
printf("%.2s %c\n", s, c);
//输出:ab *

printf 函数的具体细节实现

接下来将介绍这个函数使用的具体细节和主要注意点。

格式符数量与输出表列不匹配

在上面的讨论中我们总是保持格式符数量和输出表列保持一致,使输出正确。但是如果两者数量不匹配,会产生什么结果?我们要分两种情况讨论。

首先是格式符数量小于输出表列数量:

int a=10,b=20;
printf("%d",a,b);  //格式控制%d只有一个,而输出表列却有两个a、b
/* 输出只有一个数字,且为前一个:10 */

其次是格式符数量大于输出表列数量:

int a=10,b=20;
printf("%d %d %d",a,b);  //格式控制%d有三个,而输出表列却只有两个a、b
/* 正确输出a、b的值,多出一个输入为不可信的随机值 */

所以规律可以总结为下表:

格式符数量(%)小于输出表列数量 只输出与格式符相同数量的输出表列
格式符数量(%)大于输出表列数量 只输出与格式符相同数量的输出表列,多出不可信值

printf 返回值问题

printf 作为一个函数也有返回值,它的返回值为实际输出的字符总数量(包括换行和空格等)。这里需要注意的是,在输出表列中的一个数输出可能有很多位,比如仅仅需要输出一个 int 型变量a,a的值为1000,但是返回值为4,因为1000虽然是一个数但是有4位。具体实例代码如下:

int a=1000;
int ret=printf("%d \n",a); //输出 1000(空格+换行)
printf("%d",ret);
/* 输出6(4位数字+1空格+1换行) */

再提醒一下,最容易忽视的两点是:①一个数字可能会有多位,不要当作1计算 ②换行也算一个输出字符,不要遗漏。

格式控制符 / 附加格式控制符 的位置

在 printf 函数中,对格式控制符和附加格式控制符的位置顺序有以下规定:%后依次为附加格式控制符和格式控制符。也就是说附加格式控制符在基本格式控制符之前。

如:

%hi:短整型十进制有符号整数

%lX:长整型十六进制无符号整数

......

还有一点需要注意的是,输出时如果输出的数据类型与格式控制符的类型不一致,则以格式控制符为准(相当于会做一个类似于强制类型转换的操作)。

其他需要注意的细节

  • 当设置了输出宽度时,若数字为负数,则负号也占据一位。
  • %g和%G都是选择小数和科学计数法中较短的一种情况输出,且只输出六位有效数字。若输出的是指数形式(科学计数法),%g输出小写e,而%G输出大写E。
  • 当数据有效位数超过精度时,超出部分用不可信的随机值补足位数。如果指定的总宽度小于有效位数的宽度,输出有效位数宽度(即有效位数全部输出不截断),超过部分用不可信的随机值补足。

以上就是C方式格式化输出的所有内容。后续会跟进一篇C语言格式化输入相关文章。

C方式格式化输出(printf 函数详解)相关推荐

  1. C语言printf函数详解和示例

    文章目录 1.类型符(type) 2.宽度(width) 3.对齐标志(flags) 4.精度(prec) 5.格式化输出到字符串 6.获取视频教程 7.版权声明 C语言格式化输出的函数有printf ...

  2. C语言 printf格式化输出,参数详解

    有关输出对齐 int main(int argc, char* argv[]) {  char insertTime[20] = {"1234567890"};  double i ...

  3. printf()函数详解

    感谢博主的分享:https://me.csdn.net/blog/K346K346 1.printf()简介 printf()是C语言标准库函数,用于将格式化后的字符串输出到标准输出.标准输出,即标准 ...

  4. c语言编写printf函数,C语言之printf函数详解

    一  基本用法 格式化控制符:%d %c %ld %lf 意思是:相当于在要输出的语句里面挖了一个坑,也就是在内存中开辟空间,然后再那个坑的位置(也就是开辟好的空间),填上你想要显示的值 printf ...

  5. C语言printf函数详解

    本文已整合到C语言标准库深度解读 printf是绝大多数人接触的第一个C语言函数,但绝大多数人对printf的认识也就到了hello world为止了,很多人甚至看不懂这个函数的声明: int pri ...

  6. printf函数详解

    printf printf()函数是格式化输出函数, 一般用于向标准输出设备(显示器.控制台等终端)按规定格式输出信息,其关键字最末一个字母f即为"格式"(format)之意. 输 ...

  7. 【C语言】printf()函数详解

    printf函数称为格式输出函数,其关键字最末一个字母f即为"格式"(format)之意.其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上.在前面的例题中我们已多次使用过这 ...

  8. postgres格式化时间_postgreSQL格式化时间的函数详解

    数据类型格式化函数: PostgreSQL格式化函数提供一套有效的工具用于把各种数据类型(日期/时间.integer.floating point和numeric)转换成格式化的字符串以及反过来从格式 ...

  9. php echo 前后有字符串,php echo 输出字符串函数详解、多行输出方法

    echo "abc";//字符串 echo "abc$c";//字符串+变量 echo 'abc$c';//字符串 asd$c $c不是变量 echo &quo ...

最新文章

  1. [转]关于MyEclipse下的项目无法使用BASE64Encoder问题的解决办法
  2. java 性能调优:35 个小细节,让你提升 java 代码的运行效率
  3. Java的clone()用法实例解析
  4. typescript入门简明教程
  5. java outlook 发送邮件_基于java使用JavaMail发送邮件
  6. mybatis不等于某个字符串的值_MyBatis 的 4 个妙用,别再踩坑了!
  7. python selenium爬虫代码示例_python3通过selenium爬虫获取到dj商品的实例代码
  8. 报表中去除字符中的空格
  9. 使用staatus和defaultStatus属性改变状态栏信息
  10. bs4 乱码_python使用beautifulsoup乱码问题
  11. 机器学习相关博客收藏(KL 散度、信息熵、谱聚类、EM、Isolation Kernel、iForest、元学习、小样本学习、课程学习)
  12. 微课计算机教学研究案例,《微课在中学信息技术教学中有效运用的案例研究》的开题报告...
  13. c语言cad改变字体大小,cad怎么改变默认文字字体
  14. 中国网络安全企业50强
  15. 使用LIME解释CNN
  16. mysql创建表格例子_Mysql创建表例子 | restcy 技术博客
  17. 七夕送什么蓝牙耳机,经济实惠的蓝牙耳机盘点
  18. PMP讲义第二章 项目运行环境
  19. Eventually Consistent(最终一致性)(转)
  20. mysql sql调用函数_MySQL函数使用

热门文章

  1. 隐私保护之zk-SNARK
  2. 谁偷偷删了你的微信?别慌!Python帮你都揪出来了
  3. Matlab之阵列分析传感器sensorArrayAnalyzer工具箱
  4. 如何在线将PDF转成图片
  5. 使用Excel滚动条选择报告日期
  6. java 计算 两个日期 相差多少天
  7. 计算机中移动文件几种方式,Mac 教程:OS X「剪切」移动文件的三种方法
  8. Android操作系统的发展史
  9. Foreign data wrappers
  10. DDD学习笔记 - 总结篇