C语言基础知识——printf
printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。
printf()函数的调用格式为: printf("<格式化字符串>", <参量表>)。
格式输出,它是c语言中产生格式化输出的函数(在 stdio.h 中定义)。用于向终端(显示器、控制台等)输出字符。格式控制由要输出的文字和数据格式说明组成。要输出的的文字除了可以使用字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。
用法:
int printf(const char *format, [argument]);
Format 参数是包含三种对象类型的一个字符串:
用法:
int printf(const char *format, [argument]);
Format 参数是包含三种对象类型的一个字符串:
* 无格式字符复制到输出流;
* 转换规范,每个规范导致在值参数列表中检索 1 个或更多个项;
* 转义序列。
通常意义上format的格式如下:
%[flags][width][.prec][F|N|h|l]type
type
l 长整数(long int) (此处如果与d搭配为%lld则为long long int(C99),与f搭配为%llf则为long double(C99))
type
type的字符用于规定输出数据的类型,含义如下:
字符 |
对应数据类型 |
含义 |
d / i |
int |
接受整数值并将它表示为有符号的十进制整数,i是老式写法 |
o |
unsigned int |
无符号8进制整数(不输出前缀0) |
u |
unsigned int |
无符号10进制整数 |
x / X |
unsigned int |
无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF(不输出前缀0x) |
f(lf) |
float(double) |
|
e / E |
double |
科学计数法表示的数,此处"e"的大小写代表在输出时用的“e”的大小写 |
g / G |
double |
使用以上两种中最短的形式,大小写的使用同%e和%E |
c |
char |
|
s / S |
char * / wchar_t * |
字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0‘结尾,这个'\0'即空字符) |
p |
void * |
以16进制形式输出指针 |
n |
int * |
到此字符之前为止,一共输出的字符个数,不输出文本 |
% |
无输入 |
不进行转换,输出字符‘%’(百分号)本身 |
m |
无 |
打印errno值对应的出错内容,(例: printf("%m\n"); ) |
注:%g、%G在小数点位数四位或指数大于等于精度时用%e、%E,否则用%f。
flags
flags 规定输出样式,取值和含义如下:
字符 |
字符名称 |
说明 |
- |
减号 |
左对齐,右边填充空格(默认右对齐) |
+ |
加号 |
在数字前增加符号 + 或 - |
0 |
数字零 |
将输出的前面补上0,直到占满指定列宽为止(不可以搭配使用“-”) |
|
空格 |
输出值为正时加上空格,为负时加上负号 |
# |
井号 |
type是o、x、X时,增加前缀0、0x、0X type是e、E、f、g、G时,一定使用小数点 type是g、G时,尾部的0保留 |
width
用于控制显示数值的宽度,取值和含义如下:
n(n=1,2,3,4,5,6...): 宽度至少为n位,不够以空格填充。
* 格式列表中,下一个参数还是width
width是一个可选的指定最小值字段宽度的十进制数字字符串。如果转换值字符少于字段宽度,该字段将从左到右按指定的字段宽度填充。如果指定了左边调整选项,字段将在右边填充。如果转换结果宽于字段宽度,将扩展该字段以包含转换后的结果。不会发生截断。然而,小的精度可能导致在右边发生截断。
prec
用于控制小数点后面的位数,取值和含义如下:
无按缺省精度显示0
当type=d,i,o,u,x时,没有影响;
type=e,E,f时,不显示小数点
n(n=1,2,3...)
当type=e,E,f时表示的最大小数位数;
type=其他,表示显示的最大宽度
prec是指可选的精度。精度是一个 .(点)后跟十进制数字字符串。如果没有给出精度,按 0(零)对待。精度指定:
* d、o、i、 u、x 或 X 转换的最少数字显示位数。
* e 和 f 转换的基数字符后的最少数字显示位数。
* g 转换的最大有效数字位数。
* s 转换中字符串的最大打印字节数目。
F|N|h|l
表示指针是否是远指针或整数是否是长整数
F 远指针
N 近指针
h 短整数(short int)
l 长整数(long int) (此处如果与d搭配为%lld则为long long int(C99),与f搭配为%llf则为long double(C99))
[Argument]
包含需要输出的数据,可以是常量(字符常量、数字常量、字符串常量),变量,以及运算式。此处的数据应当与前面的format中的格式控制符一一对应(如果不对应会产生错误)。
转义序列
这些转义序列在字符串中会被自动转换为相应操作命令
符号 |
意义 |
符号 |
意义 |
\a |
铃声(提醒) |
\b |
Backspace |
\f |
换页 |
\n |
换行 |
\r |
回车 |
\t |
水平制表符 |
\v |
垂直制表符 |
\’ |
单引号 |
\” |
双引号 |
\\ |
反斜杠 |
\? |
文本问号 |
\ ooo (例如\024) |
ASCII字符(OCX) |
\xhh (例如:\x20) |
ASCII字符(HEX) |
\xhhhh |
宽字符(2字节HEX) |
例如,WCHAR f = L'\x4e00' 或 WCHAR b[] = L"The Chinese character for one is \x4e00"。
函数返回值
printf函数类型为整型,其返回值是整型值。
其值为printf实际控制输出的字符数。
printf函数实际上是将所有参数按字符输出,根据该函数的参数1(const char *format),我们不难理解。
例如:
1
2
3
4
|
int a=6, b; //a的值为6 b = 24; //b的值为24 printf ( "the value of printf is:%d\n" , a ); printf ( "%d\n" , b ); |
以上程序将会输出:
![](https://images2015.cnblogs.com/blog/790232/201602/790232-20160209115638589-861954078.jpg)
程序举例例一:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <stdio.h> #define C "C Programming" int main( void ) { int a=12345; float b=5.12345678; char e,d,f; scanf ( "%c %c %c" ,&e,&d,&f); printf ( "int is:%d\n" ,a); printf ( "float is:%f\n" ,b); printf ( "char is:%s\n" ,C); return 0; } |
例二
printf 也可以这样用(具体请参照 C 语法,字符串相关内容。这不是 printf 特有功能):
1
|
printf ( "123\n" , "456\n" , "789\n" ); |
输出:
123
注意:
1
|
printf ( "123\n" "456\n" "789\n" ); |
的输出结果与
1
|
printf ( "123\n" ); printf ( "456\n" ); printf ( "789\n" ); |
是相同的。
因此输出多行时,也并不需要每行调用一次printf。
例三
妙用printf判断闰年程序
1
2
3
4
5
6
7
8
|
#include<stdio.h> int main( void ) { int a; scanf ( "%d" ,&a); printf ( "%s" ,a%(a%100?4:400)? "NO" : "YES" ); return 0; } |
(此例中用到了?:的运算符)
例四
1
2
3
4
5
6
7
8
9
10
11
|
#include <stdio.h> #include<string.h> int main( void ) { char ch[20]; int m,n; strcpy (ch, "Happy!" ); scanf ( "%d%d" ,&m,&n); printf ( "%*.*s\n" ,m,n,ch); return 0; } |
其中前边*定义的是总的宽度,后边*是指定输出字符个数。分别对应外边参数m和n。