格式化输入输出

格式化输入输出

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 不可选的,就是最后的格式符号
  1. 默认参数是按照传递顺序的,也可以使用%n$来挑选(计数是从1开始),但是这两种不能混用,虽然混用也能打印.如果使用%n$的情况不指定宽度和精度,应该用通配语法*n$

  2. 如果宽度和精度需要后续手动提供,占位符就是*,比如%*d

int a=10,d=30;
double b=20,c=30;
printf("---%*d---\n", a, d);    //a 是宽度
printf("---%.*f---\n", a,b); 	//a 是小数位数

---        30---
---20.0000000000---
  1. 关于占位符的更进一步说明, 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
  * 表示转换的结果不放到参数			
  						字符宽度
  1. 可以使用%n$指定参数位置
  2. %[]扫描字符集合,scanf("%[abc]", buf);  //输入abcdabcd123, buf内容为abc
  3. [a-z] //捕获包括字符从a到z的所有字符,直到找到一个非a-z的字符
  4. []中如果第一字符为^符号则表示出现[]中的内容则停止捕获
  5. 有一些参考https://www.cnblogs.com/windpiaoxue/p/9184194.html
posted @ 2019-11-29 20:27  zongzi10010  阅读(188)  评论(0编辑  收藏  举报