直接说明
代码
#include
int main()
{
int a,b;
scanf(“%2d%*2s%2d”,&a,&b);
printf(“%d,%d\n”,a,b);
}
测试1
输入:123456
输出:12,56
测试2
12345678
输出:12,56
问题:%*2s是什么输入格式,有什么作用
答案:表示的是忽略对应输入的这部分数,那么到底忽略那部分数呢?以下是详细分析
详解:假如输入值为123456,那么根据根据输入函数的格式scanf(“%2d%*2s%2d”),%2d就是取123456中的第一和第二位数,取走之后,就只剩下3456;%*2s表示忽略我所对应的这部分数,就是把3456的第一位和第二位字符不要,那么就只剩下56了,最后56就放在b地址里面了。
作用:可以用作在输入格式中,不限定输入的形式。
取个例子,要求上面代码输出格式为1,2,34.请设计输入scanf函数的输入形式,能满足以下几种输入形式:
第一种输入方式:1,2,34(以逗号做分隔符);
第二种输入方式:1 2 34 (以空格做分隔符);
第三种输入方式:1234(以tab键做分隔符)
第四种输入方式:1
2
34(以回车符做分隔符)
那么可以将输入格式设计为这样:scanf(“%c%*c%c%*c%c”,&a,&b,&c)
等于说是,无论你输入其它什么形式的分隔符,都可以用%*c将其吞掉,而不受影响,同时又起了兼容各种分隔形式符的作用。
下面我们再进行拓展一下,%*d、%.*d、%*f、%*lf、%*c、%*s。大家一看这么多,是不是头一下就大了啊,别着急,只要有耐性看下去,你就能完全理解啦。
注意:%*d、%.*d、%*f、%*lf、%*c、%*s在输入函数scanf个输出函数printf里面作用是不同的
下面我们将上面这些输入格式在scanf和printf里面分别讨论
一、scanf函数格式
1.%*d格式
具体例子
#include int main(){int a=0,b=0,c=0;scanf("%*d%d%d",&a,&b,&c);printf("%d,%d,%d\n",a,b,c);}测试1:输入 12 34 56输出 34,56,0 //忽略输入的第一个值12,因此等于说输入值为 34和56,在对这两个数与a,b,c一一匹配,a匹配的是34,b匹配的是56,c没有匹配值,就是原值0.测试2:输入 77 88 99输出 88,99,0//同上原理
%*d作用:忽略输入所对应的整数值,或者说直接将其所对应的值删除。
例子说明:忽略输入的第一个值12,因此等于说输入值为 34和56,在对这两个数与a,b,c一一匹配,a匹配的是34,b匹配的是56,c没有匹配值,就是原值0。
2.%.*d格式
具体例子
#include int main(){int a=0,b=0,c=0;scanf("%d%.*d%d",&a,&b,&c);printf("%d,%d,%d\n",a,b,c);}测试1输入 12 34 56输出 12,0,0#include int main(){int a=0,b=0,c=0;scanf("%.*d%d%d",&a,&b,&c);printf("%d,%d,%d\n",a,b,c);}测试2:输入 12 34 56 输出 0,0,0
%.*d作用:忽略其所对应的值及其之后的所有值
例子说明:在上面第一个代码中,我们将%.*d放在输入函数格式中间,发现只能输出第一个值,第二个和第三个都无法输出。在第二个代码中,将%.*d放在输入函数前面,发现都无法输入值,因此可以判断%.*d的作用就是将其对应值及之后的值都删除掉。
3.%*f、%*lf、%*c、%*s
它们的作用都等同于%*d,只不过数据格式不同,适用于浮点数,字符和字符串,就不一一说明了
二、printf函数格式
1.%*d 根据实际情况在前面补空格
int a=123; printf("a=%*d",2,a);输出:a=123(输出全部123,长度>2,不需要补空格)跟没指定一样!printf("a=%*d",10,a);输出:a=空格空格空格空格空格空格空格123(往前补7个空格,补够总共10个位)
2.%.*d 根据实际情况在前面补0
printf("a=%.*d",2,a);输出:a=123(输出全部123,长度>2,不需要补0)跟没指定一样!printf("a=%.*d",10,a);输出:a=0000000123(往前补7个0,补够总共10个位)很显然这种情况意义不大,因为我们很少需要补0.所以基本不用这种写法。
3.%*f 根据实际情况在后面补0
float a=12;printf("a=%*f",3,a);输出:a=123.000000默认小数点后面6位。而且肯定会输出全部,所以10位>指定的3位,跟没指定一样!printf("a=%*f",13,a);输出:a=空格空格空格123.000000默认小数点后面6位。而且肯定会输出全部10位,剩下3位,所以在前面填3个空格(小数点也算一位)
4.%.*f 指定小数点后几位
5. %*s 根据实际情况在前面家空格
char *a="123456";printf("a=%*s",5,a);输出:a=123456;因为5<6,所以跟没指定的一样printf("a=%*s",10,a);输出:a=空格空格空格空格123456
6.%.*s 指定截取前面的几位数
char *a="123456";printf("a=%.*s",4,a);输出:a=1234;截取前面4位数printf("a=%.*s",10,a);输出:a=123456截取前面10位数,因为只有6位,所以跟没指定的一样!