题干:
输入一个人的出生日期(包括年月日),将该生日中的年、月、日分别输出。
数据范围:年份满足 1990≤y≤2015 1990≤y≤2015 ,月份满足 1≤m≤12 1≤m≤12 ,日满足 1≤d≤30 1≤d≤30
输入描述:
输入只有一行,出生日期,包括年月日,年月日之间的数字没有分隔符。
输出描述:
三行,第一行为出生年份,第二行为出生月份,第三行为出生日期。输出时如果月份或天数为1位数,需要在1位数前面补0。
初看这道题时,会感到非常简单
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%d%d", &year, &month, &day);
printf("year=%d\n", year);
printf("month=%d\n", month);
printf("day=%d\n", day);
return 0;
}
大部分初学者都这么写完就认为自己完成了,但这样的输出结果是:
这样输入之后是不会进入下一步打印的。其实道理也很简单,这样输的值编译器是不知道你给他了一个值还是三个值,所以scanf的步骤还没有结束。
那么如何做才能让代码正确运行起来能?
在这里我就要介绍一个scanf函数的%m格式控制。scanf函数的%m格式控制可以指定输入域宽,输入数据域宽(列数),按此宽度截取所需数据。就比如说这个题,它想要4 2 2的分开输入的数字,那么我们可以这么做:
scanf("%4d%2d%2d", &year, &month, &day);
输入没问题了,那是不是就完成了呢?
我们接下来再看一下程序运行的结果:
我们发现好像和题目要求的又有些不一样—month应该打印出的是02,但VS打印的是2。
怎么办呢?
下面就要介绍一下printf函数的%0格式控制符。通过printf函数的%0格式控制符,输出数值时指定左面不使用的空位置自动填0。
这里再补充一下:%0后面还要加上这个变量所需要的数字长度。比如"month = %02d"
有了这个知识,这道题就迎刃而解了。
最后我们来看一下正确的代码和运行结果:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%4d%2d%2d", &year, &month, &day);
printf("year=%d\n", year);
printf("month=%02d\n", month);
printf("day=%02d\n", day);
return 0;
}