格式化IO -- scanf 族 与 printf 族

2014-07-25 18:38:10   最后更新: 2014-07-25 18:39:33   访问数量:650




int printf(const char *format,[argument]); int fprintf(FILE *stream,char *format,[argument]);

 

两个函数若成功返回输出的字符数,否则返回负值

 

int sprintf( char *buf, const char *format, [ argument] … ) ; int snprintf(char *buf, size_t size, const char *format, ...);

 

两个函数若调用成功返回存入数组buf的字符数,否则返回负值

 

  • 注意的是,sprintf是不安全的,可能会造成buf的溢出,但是调用snprintf前会先清空buf,这点要注意

 

转换说明有四个可选部分和一个不可选部分组成:

% [flags] [fldwidth] [precision] [lenmodifier] convtype

 

flags:

-      : 在字段内左对齐输出

+      : 总是显示带符号转换的符号

(空格)    : 如果第一个字符不是符号,则在其前面加上一个空格

#      : 指定另一种转换形式(如对于十六进制,加0x前缀)

0      : 添加前导0填充(而不是空格)

 

fldwidth:

fldwidth说明转换的最小字符宽度,如果转换得到字符较少,则用空格填充(在flags不为0的情况下),字段宽度可以是一个非负十进制数或‘*’

 

precision

说明整型转换后最少的数字位数、浮点数转换后小数点后的最少位数、字符串转换后的最大字符数。可以使一个非负十进制整数或‘*’

fldwidth和precision都可以是‘*’,此时,一个整型参数指定宽度或精度的值。这个整型参数正好位于被转换参数之前

 

lenmodifier

说明参数长度,可选取值如下:

hh     有符号或无符号的char

h      有符号或无符号的short

l      有符号或无符号的long或者宽字符

ll     有符号或无符号的long long

j      intmax_t 或 uintmax_t

z      size_t

t      ptrdiff_t

L      long double

 

convtype

convtype是不可选的,它控制如何解释参数,取值如下:

d、i        有符号十进制

o           无符号八进制

u           无符号十进制

x、X        无符号十六进制

f、F        double精度浮点数

e、E        指数格式的double精度浮点数

g、G        解释为 f 或 e 取决于被转换的值

a、A        十六进制指数格式的double精度浮点数

c           字符(lc为款字符)

s           字符串(ls为宽字符串)

p           指向void的指针

n           将到目前为止,所写入的字符数写入到指针所指向的无符号整形中

%            %字符

C            等价于lc,宽字符

S            等价于ls,宽字符串

 

变种

以上四个函数有四个变种,即在每个函数名前加字母v,如vprintf,只是将可变参数列表 . . . 变成了va_list arg,定义于stdarg.h头文件中。

详见<a href="article.php?id=10182476">深入思考va_arg宏</a>

 

int scanf( const char *format, ... ); int fscanf(FILE *stream, char *format,[argument...]); int sscanf( const char *, const char *, ...);

 

返回指定的输入项数,如果输入出错,或在任意变换前已到达文件结尾,则返回EOF

 

  • 转换说明由三个可选部分组成和一个不可选部分组成:

% [*] [fldwidth] [lenmodifier] convtype

 

  1. 可选的‘*’用于抑制转换,即转换结果并不放在参数中。
  2. fldwidth说明最大字符数
  3. lenmodifier说明要用转换结果初始化的参数大小

 

convtype参数解释:

以上2、3、4三个部分都与printf函数族有同样的支持

但convtype还有以下两个选项可供选择:

[       匹配列出的字符,以]终止

[^      匹配除列出的字符,以]终止

与printf一样,scanf也支持函数使用由stdarg.h定义的可变参数列表的vscanf系列

 






读书笔记      技术帖      c语言      龙潭书斋      apue      unix环境高级编程      io      printf      scanf     


京ICP备15018585号