格式化输出函数:printf 那些事 (C语言)
printf函数提供格式化输出转换
函数包含在头文件 <stdio.h> 中
#include <stdio.h>
......
函数的原型在头文件的声明为
_CRTIMP __cdecl __MINGW_NOTHROW int printf (const char *, ...);
第一个参数 const char * 来指明输出的格式 , 按照格式对输出进行转换, 并写到标准输出流中(stdin),后面的三个点 . . . 表示此处的参数是可变参数,这样可以满足不同的输出需求
如果打印输出成功函数返回打印的字节数(函数返回值为 int 类型), 如果出错则返回一个负值
1 #include <stdio.h>
2
3 int main()
4 {
5 int i = printf("你好\n");
6 printf("%d\n", i);
7 return 0;
8 }
输出
你好
5
成功输出 你好 并且返回打印的字符个数 5 (一个汉字的编码占2个字节 * 2 + '\n'一个字节 = 5)
格式串由两种类型对象组成:
----- 普通字符(将被复制到输出流中)
----- 转换说明(分别决定下一个后续参数的转换和打印), 每个转换说明均以 % 开头, 以转换字符结束, 在%与转换字符之间可以一次包括下列内容
- 标志
- 指定被转换的参数在其字段内左对齐
#include <stdio.h> int main()
{
printf("%20s\n", "hello world\n");
printf("%-20s\n", "hello world\n");
return ;
}
输出
hello world hello world
+ 只定在输出的数前面加上正负号
#include <stdio.h> int main()
{
int i = printf("%20s\n", "hello world\n");
printf("%d\n", i);
printf("%+d\n", i);
printf("%+d\n", -i);
return ;
}
输出
hello world 21
+21
-21
空格 如果第一个字符不是正负号, 则在它的前面加上空格
#include <stdio.h> int main()
{
int i = printf("%20s\n", "hello world\n");
printf("%d\n", i);
printf("%+d\n", i);
printf("%+d\n", -i);
printf("%+ d\n", -i);
printf("% d\n", i);
return ;
}
输出
hello world 21
+21
-21
-21
21
0 对于数制转换, 当输出长度小于字段宽度时, 在前面添加 0 作为填充
#include <stdio.h> int main()
{
int i = printf("%20s\n", "hello world\n");
printf("%06d\n", i);
return ;
}
输出
hello world 000021
# 指定另一种输出格式。 如果为 o 则第一个数字为0(表示八进制), 如果为 x 或 X , 则指定在输出的非0值前加 0x 或 0X (表示十六进制)
#include <stdio.h> int main()
{
int i = printf("你好!!!\n");
printf("%#o\n", i);
return ;
}
输出
你好!!!
010
共 8 个字节, 八进制是 010
#include <stdio.h> int main()
{
int i = printf("!!!!!!你好!!!!!\n");
printf("%#x\n", i);
printf("%#X\n", i);
return ;
}
输出
!!!!!!你好!!!!!
0x10
0X10
共 16 个字节, 十六进制是 0x10
- 一个数值, 用于指定最小字段宽度
#include <stdio.h> int main()
{
printf("%d\n", );
printf("%d\n", );
printf("%d\n", );
printf("%6d\n", );
printf("%6d\n", );
printf("%6d\n", );
return ;
}
输出
8
9
10
8
9
10
当然这里默认是右对齐的
- 点号,用于分隔字段宽度和精度
- 表示精度的数
#include <stdio.h>
#define PI 3.1415926535897932384626433832795028841971693993751058209
int main()
{
printf("%30.20f\n", PI);
}
输出
3.14159265358979310000
可以看出双精度浮点型可以精确到小数点后 16 位左右
------------------- 宽度和精度中任何一个或者两个都可以用 * 代替, 通过转换下一个参数计算得到(下一个参数必须为 int 类型)
#include <stdio.h>
#define PI 3.1415926535897932384626433832795028841971693993751058209
int main()
{
int a = , b = ;
printf("%*.*f\n", a, b, PI);
}
当然结果和上面一样
- 长度修饰符 h , l 或 L 。
h:将相应的参数按照 short 或 unsigned short 类型输出
l:将相应的参数按照 long 或 unsigned long 类型输出
L:将相应的参数按照 long double 类型输出
printf 函数的转换字符(以 % 开头, 如果 % 后面的字符不是转换字符, 则它行为没有定义)
转换字符 | 参数类型, 转换结果 |
d, i | int, 有符号十进制表示 |
o | unsigned int, 无符号八进制表示(无前导0) |
x, X | unsigned int, 无符号十六进制表示(无前导0x和0X)。如果是0x, 则使用abcdef, 如果是0X, 则使用ABCDEF |
u | int, 无符号十进制表示 |
c | int, 转换为unsigned char类型后为一个字符 |
s | char *, 打印字符串中的字符, 知道遇到 '\0' 或者已经打印了有精度指定的字符数 |
f | double, 形式为 [-]mmm.ddd 的十进制表示, 其中, d的数目由精度确定, 默认精度为6, 精度为0时不输出小数点 |
e, E | double, 形式为 [-]m.dddddd e (+/-) xx 或 [-]m.dddddd E (+/-) xx 的十六进制表示, d的数目由精度确定, 默认为6, 精度为0时不输出小数点 |
g, G | double, 当指数小于 -4 或大于等于精度时, 采用 %e 或 %E 的格式, 否则采用 %f 的格式, 尾部的0与小数点不打印 |
p | void *, 打印指针值(具体表示方式与实现有关) |
n | int *, 到目前为止, 此printf调用输出的字符的数目将被写入到相应参数中, 不进行参数转换 |
% | 不进行参数转换, 打印一个符号 % |
格式化输出函数:printf 那些事 (C语言)的更多相关文章
- C语言printf()函数:格式化输出函数
C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为: int printf( char ...
- c语言中格式化输出函数的研究
<一>; 1.前言 在gcc编程中,我们比较经常用到的字符格式化输出函数是printf的,实际上gcc继承了c语言处理字符具有强大功能的风格,它提供了一系列的格式化输出函数,主要存在两个库 ...
- Shell 格式化输出printf、awk
目录 Shell 文件的格式化与相关处理 printf.awk 格式化打印printf 案例.格式化输出文件内容 输出命令echo 案例 awk数据处理工具 语法格式 处理流程 AWK内置变量 条件 ...
- XLT格式化XML那点事(C#代码中的问题解决)(二)
接上篇<XML通过XSL格式化的那点事(XML到自定义节点折叠显示)>,本文就如何将大的XLST分割成小文件和如何用C#将XML通过XSL生成HTML文件中的问题做下分析,避免有同样需求的 ...
- XML通过XSL格式化的那点事(XML到自定义节点折叠显示)
引言 有时我们想看下系统生成的XML文件(如XML格式的Project文件),如果文件结构简单,我们浏览器看起来还比较方便,但是随着XML schema复杂后就变得让人头疼啦,单独写一个程序去做展现又 ...
- 7.20.01 java格式化输出 printf 例子
java格式化输出 printf 例子 importjava.util.Date; publicclassPrintf { publicstaticvoidmain(String[] args) { ...
- Java面向对象 第2节 Scanner 类和格式化输出printf
§Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 1.创建 Scanner 对象的基本语法:Scanner s = ...
- 【转】java格式化输出 printf 例子
[转]java格式化输出 printf 例子 转自http://www.cnblogs.com/TankMa/archive/2011/08/20/2146913.html#undefined imp ...
- shell编程系列15--文本处理三剑客之awk格式化输出printf
shell编程系列15--文本处理三剑客之awk格式化输出printf printf的格式说明符 格式符 含义 %s 打印字符串 %d 打印十进制数 %f 打印一个浮点数 %x 打印十六进制数 %o ...
- 【JAVA】格式化打印printf的使用
格式化打印printf的使用 import java.util.Date; /** * 使用printf输出 */ /**关键技术点 * 使用java.io.PrintStream的printf方法实 ...
随机推荐
- LJ 5月6日A组考试考试题解
[题目] T1(L2837) 晚餐队列安排 [题面] 为了避免餐厅过分拥挤,FJ要求奶牛们分2批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想,所有第2批就餐的奶牛排在队尾,队伍的前半部分 ...
- 【NOIP 2018】保卫王国(动态dp / 倍增)
题目链接 这个$dark$题,嗯,不想说了. 法一:动态$dp$ 虽然早有听闻动态$dp$,但到最近才学,如果你了解动态$dp$,那就能很轻松做出这道题了.故利用这题在这里科普一下动态$dp$的具体内 ...
- raft 论文
raft 论文,摘自 http://www.infoq.com/cn/articles/raft-paper raft动画:https://raft.github.io/ raft说明动画:
- 【codevs1065】01字符串
题目大意:输出仅由 0 和 1 组成的长度为 N 的字符串个数,并且其中不能含有 3 个连续的相同子串. 题解:数据太水,正规解法应该是枚举后缀进行判断. 代码如下 #include <bits ...
- 烦人的IE7、8,半透明滤镜(filter:alpha)失效、png半透明失效的解决办法
在项目中的问题,之前用的是用IETest测试IE7,8发现背景透明设置无效,后来找文章解决!看了一些资料,做下总结. 几种IE半透明CSS样式 IE8里可以这样写 -ms-filter:”progid ...
- 数据结构(三)串---BF算法(朴素模式匹配)
(一)BF算法了解 BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法.BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T ...
- iOS手势UIGestureRecognizer的使用及手势冲突的解决办法【转】
转自:iOS开发中的手势体系——UIGestureRecognizer分析及其子类的使用 关于手势的一篇很好的帖子,转载过来免得丢失.你可能最感兴趣的是手势间的互斥处理,那么就搜索 4.手势间的互斥处 ...
- Anaconda+django写出第一个web app(八)
今天来实现网站的登入和登出功能. 首先我们需要在urls.py中添加路径,注意此处的路径和在导航栏中设置的文字路径保持一致: from django.urls import path from . i ...
- ZYNQ. Interrupt(2)SPI.AXI TIMER
Shared Peripheral Interrupts (SPI) SPI 可以接收来自PL的中断,这里使用PL模块 AXI Timer 的中断模式,并连接到CPU. AXI TIMER 定时器,内 ...
- C - Segments POJ - 3304 (判断线段相交)
题目链接:https://vjudge.net/contest/276358#problem/C 题目大意:给你n条线段,问你是否存在一条线段使得所有的线段在这条直线的投影至少具有一个交点? 具体思路 ...