一个题目的启发

题干:

输入一个人的出生日期(包括年月日),将该生日中的年、月、日分别输出。

数据范围:年份满足 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值