直接说明

代码

#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位,所以跟没指定的一样!