专栏首页轮子工厂2. C语言 -- printf 的花式操作

2. C语言 -- printf 的花式操作

(。・∀・)ノ゙嗨!大家好,我是呆博~很开心可以在这里给接着大家分享我的 C 语言学习笔记~因为微信对于代码块的支持并不是很好,所以代码部分以截图形式呈现,如果想获取原始代码可点击底部 阅读原文 获得。

1

从一个报错讲起

在上一篇文章中,我们使用了 C 语言在屏幕中输出了"Hello World!",但就printf这个函数而言,它的使用却不只是这么简单。比如我们想通过下面这段代码在屏幕上输出鱼形图案

在使用 gcc 进行编译的时候会出现如下的报错

这个问题是因为printf的用法不符合要求,那正确的用法是什么样的呢?

2

printf 函数

printf 函数用于打印格式化字符串到标准输出流,其函数原型为

其中的 format 参数是一个格式化字符串,由格式化占位符和普通字符组成,“,”后面接的是与占位符所对应的数字、字符串等。格式化占位符(以 % 开头)用于指明输出的参数值如何格式化。直白的讲,const char * format 这一大堆是一个字符串,变量不能直接写在字符串中,所以用占位符占位。

2.1

格式化占位符(format)的语法

格式化占位符(format)的具体语法如下

%[flags][width][.precision][length]specifier

其中的 “[]” 表示可选参数,因此每一个格式化占位符均以 % 开始,以转换字符(specifier)结束。因此首先介绍 specifier的内容及含义,再介绍其他参数。这些参数不需要都背下来,只需要记下常用的即可。

specifier(转换字符,必选)

specifier 的内容及含义如下

需要注意的是,如果 % 后边的字符不是转换字符,则其行为没有定义,编译时会报错。

flags(标志,可选)

flags的内容及含义如下:

width(宽度,可选)

width 是一个数值,用于指定最小字段的宽度。转换后的参数输出宽度至少要达到这个数值。如果参数的字符数小于该数值,则在参数左边(如果 flags 设置为 -,要求左对齐的话则在右边)填充一些字符。填充字符通常为空格,但是如果 flags 设置为 0,则填充字符为数字 0。

.precision(精度,可选)

.precision 通过点号(.)分隔字段的宽度和精度

  • 对于字符串,它指定打印的字符的最大个数
  • 对于整数,它指定打印的数字位数(必要时可加填充位 0 以达到宽度要求)
  • 对于转换字符为 e、E 或 f,它指定打印的小数点后的数字位数
  • 对于转换字符为 g 或 G,它指定打印的有效数字位数

length(长度修饰符,可选)

length 的值可以是 h、hh、l、ll 或 L

  • hh 表示将相应的参数按 signed char 或 unsigned char 类型输出
  • h 表示将相应的参数按 short 或 unsigned short 类型输出
  • l 表示将相应的参数按 long 或 unsigned long 类型输出
  • ll 表示将相应的参数按 long long 或 unsigned long long 类型输出
  • L 表示将相应的参数按 long double 类型输出

2.2

附加参数语法

int printf ( const char * format, ... )中的 ...就是附加参数,该参数的个数由格式化字符串决定。每个参数的值应当与前面格式化字符串中的占位符类型和位置一一对应

2.3

返回值

如果函数调用成功,返回值是实际打印的字符数(不包含表示字符串结束的 ‘\0’);如果函数调用失败,返回值是一个负数

2.4

使用示例

看了上面那么一大堆各种奇奇怪怪的参数,是不是有点晕,让我们举个例子看看,或许会更好理解

编译执行得到如下结果

3

转义字符

通过上面的介绍可知const char * format是一个字符串,但是文章开头的那种写法明显不是一个字符串,那我们应该如何调整使得它变为一个字符串呢?通过转义字符。

在 C 语言中,用双引号括起来的内容称之为字符串,即平时所说的文本。字符串可以由可见字符和转义字符组成,像上面所示的那条鱼的主要组成部分——星号(*),就是可见字符。可见字符就是你输入什么,显示出来就是什么。而你如果想将一个字符串分为两行来显示,那么你就需要使用到转义字符。转义字符一般是表示特殊含义的非可见字符,以反斜杠开头,常见的转义字符及其含义如下表

在字符串中反斜杠 + 字符是转义字符,表示特殊含义。但反斜杠如果后边不带任何字符(直接换行),表示我们希望 C 语言将该行以及下一行看做是一个整体。

所以为了打印输出一条鱼,我们要将\n\一起使用,具体代码如下

执行结果如下图所示

当然这样的图案可以打印很多,百度搜索 “初级字符画绘制工具”我们可以获得很多表情,或者自定义一个表情,比如说下面的派大星

输出结果如下

好了~今天的内容就到这里了,感谢大家的信任和支持~

本文分享自微信公众号 - 轮子工厂(Programmer-ing),作者:独孤呆博

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 未来10年,软件开发技术的8个发展趋势

    英文 | https://medium.com/better-programming/software-developer-trends-of-2020-and...

    谭庆波
  • 让我第3不开心的事是:同样是程序员,你竟然选择了偷懒~

    好几个人在后台催更C语言教程,其实我也很委屈鸭,呆博去浪去了,然后他就义正言辞的和我说不想排版推文,一听就是想要偷懒的借口,口亨~

    谭庆波
  • 2018全球计算机与工程学科排名:清华第7,中国9个学科世界第一!

    日前,软科(前身是ARWU上海交大排名)正式发布了《2018软科世界一流学科排名》(ShanghaiRanking' s Global Ranking of A...

    谭庆波
  • oss-server 小型对象存储系统

    oss-server是针对项目开发时提供的小型对象存储系统,开发者在针对文件上传时业务剥离,同时方便文件迁移,为满足单个项目,多个系统的情况下,提供统一的oss...

    八一菜刀
  • 【Vue原理】依赖收集 - 源码版之引用数据类型

    这一篇内容是针对 引用数据类型的数据的 依赖收集分析,因为引用类型数据要复杂些,必须分开写

    神仙朱
  • Android获取其他包的Context实例然后干坏事 博客分类: Android AndroidSecurityOSCC++

          Android中有Context的概念,想必大家都知道。Context可以做很多事情,打开activity、发送广播、打开本包下文件夹和数据库、获取...

    chroya
  • 《Redis设计与实现》简读

    一、数据结构与对象 简单动态字符串(SDS) 相比C字符串增加记录字符串长度的,获取字符串长度复杂度为O(1) 相比C字符串增加记录已分配内存空间,可以避免缓冲...

    MonroeCode
  • 特朗普焦虑出狠招:邀台积电英特尔三星赴美设厂,台积电会去吗?

    《华尔街日报》报道,白宫官员正在与英特尔和台积电商讨在美国建厂。三星电子也参与其中。

    新智元
  • 函数默认值

    看到这里,上面的问题你应该就彻底明白啦。。。你可以很自信的在控制台里面验证一下你的答案啦。但是,别着急,接着往下看?,你会收获更多。

    grain先森
  • 微软发布新一代Kinect,相关技术可成为HoloLens 2的核心

    VRPinea

扫码关注云+社区

领取腾讯云代金券