title: 格式化输入输出
date: 2019/11/29 20:26:40
toc: true
格式化输入输出
printf原型
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int dprintf(int fd, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
// 这个系列的函数可以看man的例子
#include <stdarg.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vdprintf(int fd, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
格式
%[flags][fldwidth][precision][lenmodifier]convtype
-左对齐 宽度 精度 L/h/hh...等
0前导
# 指定另外前缀 比如十六进制0x
[可选的] convtype 不可选的,就是最后的格式符号
-
默认参数是按照传递顺序的,也可以使用
%n$
来挑选(计数是从1开始),但是这两种不能混用,虽然混用也能打印.如果使用%n$
的情况不指定宽度和精度,应该用通配语法*n$
-
如果宽度和精度需要后续手动提供,占位符就是
*
,比如%*d
int a=10,d=30;
double b=20,c=30;
printf("---%*d---
", a, d); //a 是宽度
printf("---%.*f---
", a,b); //a 是小数位数
--- 30---
---20.0000000000---
- 关于占位符的更进一步说明,
where an argument is required, by writing "%m$" instead of '%' and "*m$" instead of '*'
,这个基本也用不到
printf("%*d", width, num);
等同于
printf("%2$*1$d", width, num);
scanf原型
#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
#include <stdarg.h>
int vscanf(const char *format, va_list ap);
int vsscanf(const char *str, const char *format, va_list ap);
int vfscanf(FILE *stream, const char *format, va_list ap);
格式
%[*] [fldwidth] [m] [lenmodifier]convtype
* 表示转换的结果不放到参数
字符宽度
- 可以使用
%n$
指定参数位置 %[]
扫描字符集合,scanf("%[abc]", buf); //输入abcdabcd123, buf内容为abc
[a-z] //捕获包括字符从a到z的所有字符,直到找到一个非a-z的字符
- []中如果第一字符为^符号则表示出现[]中的内容则停止捕获
- 有一些参考
https://www.cnblogs.com/windpiaoxue/p/9184194.html