格式化format
输出:%[flags][width][.precision][length] specifer
输入:%[*][width][length]specifier
flags:(输出)
- 左对齐,默认右对齐
+ 正数显示+,负数显示-
# %#x或%#X按照十六进制0x+数值或者0X+数值形式输出,%#o按照八进制0+数值形式输出
0 数值宽度小于width参数时左侧补0
width:(输入/输出)
作为输入函数时:表示最多接收多少字符(小数点也算一个字节)。
作为输出函数时:表示最少输出多少字符,原数值字符个数小于width时按照对齐方式补0或空格,
原数值字符个数大于width时原样输出。限制小数时小数点也算一个字符。
.precision精确度:(输出)
.number:用在d、i、u、x、X、o类型,当数值字符个数小于number时前置补0。
用在e、E、f、F类型,表示小数点后面有几位数。
用在g、G类型表示有效数字(左侧第一个非0数字开始)最大宽度(不包括小数点)
用在s类型表示最多输出多少字符
specifer分隔符(输入/输出)
%d or %i 符号类型signed十进制整数,作输入函数时%i还可以接收八进制、十六进制数
%u 无符号类型unsigned十进制整数,作输入函数时%i还可以接收八进制、十六进制数
%o 八进制
%x 小写十六进制
%X 大写十六进制
%f or %F 浮点数
%e 科学计数法1.2e+3 == 1200
%E 科学计数法1.2E-3 == 0.0012
%g 使用最短小数表示法%f 或者 %e
%G 使用最短小数表示法%F 或者 %E
%c 字符
%s 字符串
%p 指针地址
%% % 输出函数打印%,输入函数匹配'%'
%n
// 作为输入函数%n不作为一个输入参数,它记录用户输入了多少有效字符,不会影响scanf返回值
scanf("%c%n", &ch, &count); 无论输入多少字符count都等于1,因为%c只接收1个字符
scanf("%d%n", &iv, &count);输入1结束后count等于1,输入12结束后count=2
scanf("%c %c %c%n", &ch, &ch1, &ch2, &count); 输入abc结束count=3;输入a b c结束count=5,空格也计数。
// 作为输出函数记录从开始位置到%n输出了多少字符,不会影响printf返回值
printf("i=%d, j=%d/n%n", i, j, &k);
在i=343、j=123的情况下,k=12。
%[] 输入
[]组成扫描列表,从输入数据获得符合扫描成员的数据直到遇到不符合扫描成员结束。
char arr[15];
scanf("%[abcd]",arr); "abcd"组成扫描成员,输入"cbdeaf",arr="cbd","eaf"依然留在缓冲区,下文讲解清空缓冲去的方法。
scanf("%[][abc]"); "][abc"组成扫描成员。
scanf("%[[]abc]"); "[]abc"不能组成扫描成员,"]"只能紧跟"^"或"["才能组成扫描成员。
%[^] 输入
[^]组成扫描列表,从输入数据获得扫描成员以外的数据直到遇到符合扫描成员结束。
char arr[15];
scanf("%[^123]", arr); 识别123以外的数或字母
输入abc4561,arr="abc456","1"留在缓冲区
scanf("%[^][123]"); "][123"以外的字符串
大多数编译器支持scanf("%[a-zA-Z]");中的"-"表示只接收26个字母,少数编译器把"-"理解成减号。(需要个人测试)
清空缓冲区:
输出:%[flags][width][.precision][length] specifer
输入:%[*][width][length]specifier
flags:(输出)
- 左对齐,默认右对齐
+ 正数显示+,负数显示-
# %#x或%#X按照十六进制0x+数值或者0X+数值形式输出,%#o按照八进制0+数值形式输出
0 数值宽度小于width参数时左侧补0
width:(输入/输出)
作为输入函数时:表示最多接收多少字符(小数点也算一个字节)。
作为输出函数时:表示最少输出多少字符,原数值字符个数小于width时按照对齐方式补0或空格,
原数值字符个数大于width时原样输出。限制小数时小数点也算一个字符。
.precision精确度:(输出)
.number:用在d、i、u、x、X、o类型,当数值字符个数小于number时前置补0。
用在e、E、f、F类型,表示小数点后面有几位数。
用在g、G类型表示有效数字(左侧第一个非0数字开始)最大宽度(不包括小数点)
用在s类型表示最多输出多少字符
specifer分隔符(输入/输出)
%d or %i 符号类型signed十进制整数,作输入函数时%i还可以接收八进制、十六进制数
%u 无符号类型unsigned十进制整数,作输入函数时%i还可以接收八进制、十六进制数
%o 八进制
%x 小写十六进制
%X 大写十六进制
%f or %F 浮点数
%e 科学计数法1.2e+3 == 1200
%E 科学计数法1.2E-3 == 0.0012
%g 使用最短小数表示法%f 或者 %e
%G 使用最短小数表示法%F 或者 %E
%c 字符
%s 字符串
%p 指针地址
%% % 输出函数打印%,输入函数匹配'%'
%n
// 作为输入函数%n不作为一个输入参数,它记录用户输入了多少有效字符,不会影响scanf返回值
scanf("%c%n", &ch, &count); 无论输入多少字符count都等于1,因为%c只接收1个字符
scanf("%d%n", &iv, &count);输入1结束后count等于1,输入12结束后count=2
scanf("%c %c %c%n", &ch, &ch1, &ch2, &count); 输入abc结束count=3;输入a b c结束count=5,空格也计数。
// 作为输出函数记录从开始位置到%n输出了多少字符,不会影响printf返回值
printf("i=%d, j=%d/n%n", i, j, &k);
在i=343、j=123的情况下,k=12。
%[] 输入
[]组成扫描列表,从输入数据获得符合扫描成员的数据直到遇到不符合扫描成员结束。
char arr[15];
scanf("%[abcd]",arr); "abcd"组成扫描成员,输入"cbdeaf",arr="cbd","eaf"依然留在缓冲区,下文讲解清空缓冲去的方法。
scanf("%[][abc]"); "][abc"组成扫描成员。
scanf("%[[]abc]"); "[]abc"不能组成扫描成员,"]"只能紧跟"^"或"["才能组成扫描成员。
%[^] 输入
[^]组成扫描列表,从输入数据获得扫描成员以外的数据直到遇到符合扫描成员结束。
char arr[15];
scanf("%[^123]", arr); 识别123以外的数或字母
输入abc4561,arr="abc456","1"留在缓冲区
scanf("%[^][123]"); "][123"以外的字符串
大多数编译器支持scanf("%[a-zA-Z]");中的"-"表示只接收26个字母,少数编译器把"-"理解成减号。(需要个人测试)
清空缓冲区:
使用scanf("%*[^\n]%*c"); // ’*’表示读入某类型的内容,但是这个内容不保存到变量里,所以后面不需要对应的参数。