前言:
对于scanf、printf中数据格式常使用的是单个,即%d、%s、%c等
但也有着像%3d等的数据格式
虽然没有在代码中常运用 ,但也得知道分别是怎么实现的
(一)数据格式在scanf中的应用
下面用 %3d 举例
如
#include<stdio.h>
int main()
{
int n;
scanf("%3d", &n);
printf("n=%d\n",n);
return 0;
}
运行代码,从键盘输入值
1) 比给定的数据格式小或相等
如输入 12 ,输出到屏幕上为 n=12 ;
如输入 123,输出到屏幕上为 n=123;
就是说, 在scanf中,当输入的数据长度比给定的数据格式小或者相等时时,常规存取值到指定的地址处。
2) 比给定的数据格式大
如输入 12345, 输出到屏幕上为 n =123。
就是说,在scanf中,当输入的数据长度比给定的数据格式大时scanf函数会截取值存入指定的地址处。
总的来说
"%(数字)d"(或者其他转换字符)此数字在scanf中表示 最大字段宽度 。意思为,你不能输入字段比此数字还大的。即输入到达最大字段宽度时,超过宽度后面的将不再作为输入内容(相当于作废),在最大宽度内的为输入内容。
(二)数据格式在printf中的应用
还是用%3d来举例说明。
如
#include<stdio.h>
int main()
{
int n = 12345;
char arr[] = { "Hello" };
printf("%d\n", n);
printf("%s\n", arr);
return 0;
}
这里创建了一个整形变量n和一个字符数组arr。
1)数据格式小于变量长度
如printf直接用 %3d 打印 n ,输出为 12345 。
如printf直接用 %3s 打印数组 arr,输出为 Hello 。
就是说,在printf中,当变量长度比数据格式大时,printf与用"%d"数据格式输入完全相同,即原样输出。
2)数据格式大于变量长度
如printf用 %8d 打印 n ,输出为 (!)(!)(!)12345 。
如printf用 %-8d 打印 n ,输出为 12345(!)(!)(!) 。
如printf用 %8s 打印 arr ,输出为 (!)(!)(!)Hello
如printf用 %-8s 打印 arr ,输出为 Hello(!)(!)(!)
注:在本文中(!)表示空格的意思。
即第一条案例表示输出 3个空格+数字12345;第二条案例表示输出 数字12345+3个空格。
第三条案例表示输出 3个空格+字符Hello; 第四条案例表述输出 字符Hello+3个空格。
就是说,在printf中, 当变量长度比数据格式小时, printf打印完变量后用空格填充直到
数据格式达到所要求值。
注: 此方式常用来做数据的对齐用,对于数据的左对齐和友对齐有很大的帮助!
总的来说
"%(数字)d"(或者其他转换字符),此数字在printf中表示 最小字段宽度。意思为你输出的字段宽度最小为此数字,不够将用空格给填充到最小字段宽度。即当你输出的字段比最小字段宽度大时,原样输出,小时,将填充空格直到符合最小字段宽度。(可以理解成最终输出的只可以>=最小字段宽度)