第1个回答 2014-05-29
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int mon_days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
char* week_days[7] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
time_t str_to_time( char *slTime );
int str_isdigit( char *s )
{
int i;
for( i=0; s[i]; i++ )
if ( !(s[i]>='0'&&s[i]<='9') )
return 0;
return 1;
}
int is_leep_year( int year )
{
if ( year%400 == 0 || ( year%4 == 0 && year%100 != 0 ) )
{
return 1;
}
return 0;
}
/**
* date: yyyymmdd
* Sunday = 0, Monday=1, etc;
**/
int get_wday( char *date )
{
char slTime[30] = {0};
sprintf( slTime, "%s000101", date );
time_t tm = str_to_time( slTime );
struct tm *p = localtime( &tm );
return p->tm_wday;
}
int print_month( int year, int month )
{
char s_date[30] = {0};
sprintf( s_date, "%04d%02d01", year, month );
int wday = get_wday( s_date );
int i;
printf( "%04d年%02d月\n日 一 二 三 四 五 六\n", year, month );
for( i=0; i<wday; i++ )
printf( "%2s ", " " );
if ( month==2 && is_leep_year( year ) )
mon_days[1] = 29;
for( i=0; i<mon_days[month-1]; i++,wday++ )
{
printf( "%2d ", i+1 );
if ( wday == 6 )
{
printf( "\n" );
wday = -1;
}
}
printf( "\n" );
}
/*** _mktime( yyyymmddHHMMSS ) **/
time_t str_to_time( char *slTime )
{
struct tm tm_t;
char year[5];
char mon[3];
char day[3];
char hour[3];
char min[3];
char sec[3];
if ( strlen(slTime) != 14 || ! str_isdigit( slTime ) )
{
fprintf( stderr, "Usage: _mktime( yyyymmddHHMMSS )\n" );
return -1;
}
memset( year, 0x00, sizeof(year) );
memset( mon, 0x00, sizeof(mon) );
memset( day, 0x00, sizeof(day) );
memset( hour, 0x00, sizeof(hour) );
memset( min, 0x00, sizeof(min) );
memset( sec, 0x00, sizeof(sec) );
memcpy( year, slTime, 4 );
memcpy( mon, slTime+4, 2 );
memcpy( day, slTime+6, 2 );
memcpy( hour, slTime+8, 2 );
memcpy( min, slTime+10, 2 );
memcpy( sec, slTime+12, 2 );
tm_t.tm_year = atoi(year) - 1900;
tm_t.tm_mon = atoi(mon) - 1;
tm_t.tm_mday = atoi(day);
tm_t.tm_hour = atoi(hour);
tm_t.tm_min = atoi(min);
tm_t.tm_sec = atoi(sec);
tm_t.tm_wday = 0;
tm_t.tm_yday = 0;
tm_t.tm_isdst = 0;
return mktime( &tm_t );
}
int trim( char *s )
{
int i, l, r, len;
for(len=0; s[len]; len++);
for(l=0; (s[l]==' ' || s[l]=='\t' || s[l]=='\n' || s[l] == '\r' ); l++);
if(l==len)
{
s[0]='\0';
return(0);
}
for(r=len-1; (s[r]==' ' || s[r]=='\t' || s[r]=='\n' || s[r] == '\r' ); r--);
for(i=l; i<=r; i++) s[i-l]=s[i];
s[r-l+1]='\0';
return(0);
}
void stdin_proc( char *s )
{
int len = strlen( s );
if ( !str_isdigit( s ) )
{
printf( "%s 无效\n", s );
return;
}
if ( len == 4 )
{
int i, year = atoi( s );
for( i=1; i<=12; i++ )
print_month( year, i );
}
else if ( len == 6 )
{
int year = (int)( atoi(s) / 100 );
int mon = atoi(s) - year*100;
print_month( year, mon );
}
else if ( len == 8 )
{
int wday = get_wday( s );
printf( "%s 是 %s\n", s, week_days[wday] );
}
else
printf( "%s 无效\n", s );
}
int main( int argc, char **argv )
{
char str[30] = {0};
while( 1 )
{
printf( "输入(YYYY/YYYYMM/YYYYMMDD)(年大于等于1971):" );
memset( str, 0, sizeof(str) );
fgets( str, 10, stdin );
fflush( stdin );
trim( str );
if( str[0] == 'q' || str[0] == 'Q' )
break;
stdin_proc( str );
}
}