【C】C语言中的printf和scanf

时间:2022-09-05 22:05:36

printf

函数原型

extern int printf(const char *format,...);

功能

在c语言中产生格式化输出的函数(定义在 stdio.h 中),其向未重定向终端(显示器、控制台等)输出字符。

format

Format 参数是包含三种对象类型的一个字符串:

    * 无格式字符复制到输出流

    * 转换规范,每个规范导致在值参数列表中检索 1 个或更多个项

    * 转义序列

通常意义上format的格式如下:

   %[flags][width][.prec][F|N|h|l]type

type

type的字符用于规定输出数据的类型,含义如下:

字符 对应数据类型 含义
d int 接受整数值并将它表示为有符号的十进制整数
o unsigned int 无符号8进制整数(不输出前缀0)
u unsigned int 无符号10进制整数
x / X unsigned int 无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF(不输出前缀0x)
f(lf) float(double) 单精度用f,双精度用lf(尤其scanf不能混用)
e / E double 科学计数法表示的数,此处"e"的大小写代表在输出时用的“e”的大小写
g / G double 有效位数,如:%8g表示单精度浮点数保留8位有效数字。双精度用lg
c char 字符型。可以把输入的数字按照ASCⅡ码相应转换为对应的字符
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、0Xtype是e、E、f、g、G时,一定使用小数点type是g、G时,尾部的0保留

width

用于控制显示数值的宽度,取值和含义如下:n(n=1,2,3,4,5,6...): 宽度至少为n位,不够以空格填充。* 格式列表中,下一个参数还是widthwidth是一个可选的指定最小值字段宽度的十进制数字字符串。如果转换值字符少于字段宽度,该字段将从左到右按指定的字段宽度填充。如果指定了左边调整选项,字段将在右边填充。如果转换结果宽于字段宽度,将扩展该字段以包含转换后的结果。不会发生截断。然而,小的精度可能导致在右边发生截断。

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中的格式控制符一一对应(如果不对应会产生错误)。

scanf

函数原型

int scanf(const char * restrict format,...);

功能

函数 scanf() 是从标准输入流stdio (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。

格式指令

*

表示读入的数据将被舍弃。带有*的格式指令不对应可变参数列表中的任何数据。

域宽

以一个非零的十进制整数形式出现。表示该格式指令最多读入的字符数。

格式说明符

    c 读入域宽指定的数目个字符组成的字符序列(后面不会加上空字节),如果省略宽度则读入单字符。如%c或%1c读入单字符,%2c读入两个字符(后面不会加上空字节),以此类推。    s读入一个以空白字符结束的字符序列,后面会加上空字节。    d 读入可选有符号(可选有符号表示输入时可以带符号也可以不带符号,不带符号则视为非负)十进制整数。输入格式应该像strtol函数的base实参为10调用时识别的字符序列一样。    i 读入可选有符号整数。输入格式应该像strtol函数的base实参为0调用时识别的字符序列一样。    a,e,f,g,A,E,F,G 读入可选有符号浮点数,输入格式应该像strtod函数识别的字符序列一样。    o 读入可选有符号八进制整数。输入格式应该像strtoul函数的base实参为8调用时识别的字符序列一样。    x,X读入可选有符号十六进制整数。输入格式应该像strtoul函数的base实参为16调用时识别的字符序列一样。    p 读入一个指针值。读入的字符序列应该与fprintf的%p产生的字符序列形式相同。    n 不读入任何字符,而是把到该位置已读入的字符数存储到与之对应的int*指向的位置。本转换说明符如果带有*或者带有域宽信息(如:%*n或%3n等),则后果是未定义的。    u 读入可选有符号八进制整数。输入格式应该像strtoul函数的base实参为10调用时识别的字符序列一样。    [ 扫描字符集合    % 读入% 符号(百分号)    无效的转换说明符将引起未定义的行为。

长度修饰符

hh与d, i, o, u, x, X, or n配合使用,表示对应一个signed char或unsigned char数据。h与d, i, o, u, x, X, or n配合使用,表示对应一个short int或unsigned short int数据。l 与d, i, o, u, x, X, or n配合使用,表示对应一个long int或unsigned long int数据;与a, A, e, E, f, F, g, or G配合使用表示对应一个double数据;与c,s,[配合使用表示对应wchar_t数据。ll与d, i, o, u, x, X, or n配合使用,表示对应一个long long int或unsigned long long int数据。j与d, i, o, u, x, X, or n配合使用,表示对应一个intmax_t或uintmax_t数据。z与d, i, o, u, x, X, or n配合使用,表示对应一个size_t数据(或与size_t对应的有符号整型数据)。t与d, i, o, u, x, X, or n配合使用,表示对应一个ptrdiff_t数据(或与ptrdiff_t对应的无符号整型数据)。L 与a, A, e, E, f, F, g, or G配合使用,表示对应一个long double数据。如果长度修饰符与格式说明符不匹配则引起未定义的行为。

空白字符

空白字符会使scanf函数在读操作中略去输入中的一个或多个空白字符。