2013-05-26 3 views
0

C의 dd.mm.yyyy 형식으로 콘솔에서 날짜를 읽는 방법이 있는지 알고 싶습니다. 날짜 정보가있는 구조가 있습니다. 나는 일, 달, 년이있는 다른 구조체를 사용해 보았습니다 :날짜 형식 dd.mm.yyyy in C

typedef struct 
{ 
    int day; 
    int month; 
    int year; 
} Date; 

그러나 점이 문제가됩니다. 어떤 생각?

+0

제목에 dd/mm/yyyy 또는 dd.mm.yyyy와 같은 질문을 하시겠습니까? – Jens

+0

콘솔에서 문자열을 읽고 구문 분석을하면 특정 달에 x 일 또는 월 var이 13 이하인지 확인합니다. – skytz

답변

3

시도 :

Date d; 
    if (scanf("%d.%d.%d", &d.day, &d.month, &d.year) != 3) 
    error(); 
+2

'error()'는 무엇을합니까? – Paulpro

+0

'날짜 '는 유형이 아니라 변수입니다. 나는 자유를 수정했다. +1 scanf의 반환을 확인합니다. – Jens

+0

@Jens : 맞아, 고마워 ('typedef'를 놓쳤다) - @Paulpro :'error()'는 오류 메시지를 표시하고 종료 할 수있다 .. –

1

당신은 struct tm에 임의의 형식의 날짜 문자열에서 읽을 strptime()를 사용할 수 있습니다.

#define _XOPEN_SOURCE /* glibc2 needs this to have strptime(). */ 
#include <stdio.h> 
#include <string.h> 
#include <time.h> 
#include <errno.h> 

... 

Date d = {0}; 
char * fmt = "%d.%m.%Y"; 
char s[32] = ""; 
char fmt_scanf[32] = ""; 
int n = 0; 

sprintf(fmt_scanf, "%%%ds", sizeof(s) - 1); /* Created format string for scanf(). */ 

errno = 0;  
if (1 == (n = scanf(fmt_scanf, s))) 
{ 
    struct tm t = {0}; 
    char * p = strptime(s, fmt, &t); 
    if ((s + strlen(s)) != p) 
    { 
    fprintf(stderr, "invalid date: '%s'\n", s); 
    } 
    else 
    { 
    d.day = t.tm_mday; 
    d.month = t.tm_mon + 1; /* tm_mon it zero-based. */ 
    d.year = t.tm_year + 1900; /* tm_year is years since 1900. */ 
    } 
} 
else 
{ 
    perror("scanf()"); 
} 

업데이트는 :

긍정적 인 부작용이 길을가는 addtional 이익은 다음과 같습니다 그것은 모든 strptime()에 의해 이루어집니다로

  • 없음 입력 검증이 필요하지 않습니다.
  • 입력 형식을 변경하는 것은 간단합니다. fmt이 다른 형식 문자열을 가리 키도록하십시오.