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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏carven

js原生函数之call和apply,bind

call 和 apply 和 bind 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。

960
来自专栏行者常至

003.golang 类型与变量

零值并不等于空值,而是当变量被声明为某种类型后的默认值, 通常情况下值类型的默认值为0,bool为false,string为空字符串

812
来自专栏jojo的技术小屋

原 三、基本概念

作者:汪娇娇 时间:2017年11月4日 一、语法 1、区分大小写 2、标识符 指变量、函数、属性的名字,采用驼峰大小写格式。 3、注释 单行:// 多行:/*...

2605
来自专栏chenjx85的技术专栏

leetcode-80-删除排序数组中的重复项 II

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。

1371
来自专栏Python研发

JavaScript

JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应的代码,浏览器可以解释...

1442
来自专栏进击的君君的前端之路

字符串与JSON

5463
来自专栏企鹅号快讯

bash shell 中如何区别$和${}和$和

$()和${}的用法: 在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(command substitution)的。而...

35416
来自专栏Golang语言社区

Go语言——再论slice切片

Slice是长度可变的元素序列(数组不可变),每个元素都有相同的类型。slice类型写作[]T,其中T代表slice中的元素类型;slice和数组写法很像,只是...

37116
来自专栏五分钟学算法

每天一算:Contains Duplicate II

1403
来自专栏进击的君君的前端之路

函数与作用域

1374

扫码关注云+社区

领取腾讯云代金券