从8位数字中提取年份(ddmmyyyy)

时间:2013-10-13 09:49:27

标签: c

我有一个8位int来存储日期。例如,12041989是1989年4月12日。我应该在什么类型的变量中声明日期以及如何提取年份?

编辑:根据你所说的,我是这样做的:(我必须通过输入当前日期和出生日期来计算一个人的年龄)

#include <stdio.h>
#include <conio.h>
void main()
{
   unsigned int a, b, ac, an, c;
   printf("\n Current date zzllaaaa \n");
   scanf("%d", &a);
   printf("\n Date of birth zzllaaaa \n");
   scanf("%d", &b);
   ac = a % 10000;
   an = b % 10000;
   c = ac - an;
   printf("\n Age is: %d", c);
   getch();
}

有时候它会起作用,但有时却没有,我无法理解为什么。例如,对于1310201312061995,它告诉我年龄为-3022。那是为什么?

2 个答案:

答案 0 :(得分:3)

如果您不关心年份的5位或更多位数的日期,您可以使用模数运算符:

int date = 12041989;
int year = date % 10000;

在大多数机器上,类型int通常为32位宽。这足以将格式“ddmmyyyy”的日期存储在一个数字中。我不鼓励你使用unsigned int,因为两个日期的差异可能是故意的(例如,如果你不小心将出生日期放在首位,当前日期为第二,你会得到一个负面的年龄,并且你在输入中检测到错误)。

#include <stdio.h>
#include <conio.h>
int main() // better use int main(), as void main is only a special thing not supported by all compilers.
{
   int a, b, ac, an, c; // drop the "unsigned" here.
   printf("\n Current date zzllaaaa \n");
   scanf("%d", &a);
   printf("\n Date of birth zzllaaaa \n");
   scanf("%d", &b);
   ac = a % 10000;
   an = b % 10000;
   c = ac - an;
   if ( c < 0 )
   {
       printf("You were born in the future, that seems unlikely. Did you swap the input?\n");
   }
   printf("\n Age is: %d", c);
   getch();
}

答案 1 :(得分:3)

使用模运算符(%)从数字中提取数字。

int date = 12041989;
int day,month,year;

year = date%10000;
date = date/10000;
month = date/100;
date = date/100;
day  = date;