数据范围:年份满足 1990≤y≤2015 ,月份满足 1≤m≤12 ,日满足 1≤d≤30
输入描述:
输入只有一行,出生日期,包括年月日,年月日之间的数字没有分隔符。
输出描述:
三行,第一行为出生年份,第二行为出生月份,第三行为出生日期。输出时如果月份或天数为1位数,需要在1位数前面补0。
示例1
输入:
20130225
复制输出:
year=2013
month=02————此处需要%0来自动左补0
date=25
——————————————————————————————
#include<stdio.h>
int main()
{
int y, m, d;
scanf("%d%d%d,&y,&m,&d);//——如果直接输入20130225,最后输出结果为
//y=20130225 m=0 d=0
printf("%d\n%d\n%d\n",y,m,d);
return 0;
}
*原因是由于缺少控制字符来控制域的宽度*
通过scanf函数的%m格式控制可以指定输入域宽,输入数据域宽(列数),按此宽度截取所需数据;通过printf函数的%0格式控制符,输出数值时指定左面不使用的空位置自动填0。
————————————————————————————
#include<stdio.h>
int main()
{
int y, m ,d;
scanf("%4d%2d%2d",&y,&m,&d);//m是一个数字,在标准输出函数里.
//m表示输出长度控制,表示以m个字符输出,
//不足m个字符的用空格填补,输出时右对齐.
//原本输出超过m个字符的此时m无效.
//相应的%-md同上,-表示左对齐。
//固4d即从20130225里从左取四位数——2013,再2d——2(因为0默认为了空格)
//再2d——25
if(y>=1990&&y<=2015)
{
if(m>=1&&m<=12)
{
if(d>=1&&d<=30)
printf("year=%04d\n",y);
printf("month=%02d\n",m);//因为输入时%2d,为2,固需要%0来左补位
printf("date=%02d\n",d);//同上
}
}
else
printf("error");
return 0;
}
%m.nd:m代表输出一共占m列,不够m列前面补空格,够m列不作任何处理,n代表这个数一共要有n列,不够前面补0,够n列不做任何处理
int main()
{
int a = 123;
printf("%.4d\n",a);
printf("%5d\n", a);
printf("%5.4d\n", a);
return 0;
}
————————————————
C语言中的格式控制符
1.格式控制符的形式
% [-] [0] [m/m.n] [l/h] 格式控制符
其中[ ]里面的内容是可选的
-:表示左对齐,缺省情况下为右对齐(若没规定输出数据的宽度则为左对齐)。
0:当规定输出数据的宽度时,所输出数据实际的宽度小于规定的宽度,则在左边用“0”补齐。
m/m.n:m规定了输出数据的宽度(位数),若数据实际的宽度大于m,则突破m的限制全部输出,反之, 将数据全部输出之后用空格进行左补齐;对于实数n是指小数点后的位数,若n小于小数点后实际的位数,则按四舍五入原则进行截取;对于字符串,n表示从左至右截取的字符个数。
l/h:l表示长整型数据(可用于%ld。%lo,%lx,%lu),以及double型数据(%lf或%le);h表示短整型数据(可用于%hd。%ho,%hx)。
2.格式控制符及其功能
%d:用来输出有符号的十进制整数(包括char类型)
%u:用来输出无符号的十进制整数(包括char类型)
%o:用来输出无符号的八进制整数
%x:用来输出无符号的十六进制整数
%c:用来输出单个字符
%s:用来输出一个字符串
%f:用来输出小数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
%e:用来输出指数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
%g:用来输出指数形式和小数形式两者中较短的十进制浮点数(输入时小数形式和指数形式都可以识别)