2017-12-07 12 views
0

날짜에서 숫자로 변환하는 과제가 있습니다.C에서 날짜의 숫자를 추출하십시오

은 무엇인가 ...

우리는 예를 들어 2014년 2월 18일 같은 문자 문자열로 날짜를 얻을, 나는 정수 18, 2, 2014

내 방식이 완벽하지를 추출해야 당신의 의견에 가장 좋은 방법이 있습니까?

void luckChoice(char a[]){ 

    int month=10*(a[3]-'0')+(a[4]-'0'); 
    int day=(a[0]-'0')*10+(a[1]-'0'); 
    int year=(a[9]-'0')+(a[8]-'0')*10+(a[7]-'0')*100+(a[6]-'0')*1000; 
+0

표준 라이브러리의'atoi()'(ascii에서 정수) 함수를 사용할 수 있습니까? – SHG

+0

@SHG 우리는 허용되지 않습니다 – gabi939

+0

'sscanf()'함수는 어떻습니까? –

답변

1

당신이 괜찮 있다면 나도 몰라하지만 당신이 직접 자체 scanf()에서이 작업을 수행 할 수 있습니다.

는 그냥

if (scanf("%d.%d.%d", &dd, &mm, &yy) == 3) { …OK… } else { …failed… } 

이 무시로 입력을 '.' 입력으로부터 지정된 순서대로. 만약 내가 잘못

저를 수정합니다. 다음과 같이 그 밖에

당신은 sscanf를() 함수를 사용할 수 있습니다

void luckChoice(char a[]){ 
    int dd,mm,yy; 
    sscanf(a,"%d.%d.%d",&dd,&mm,&yy); 
} 
+0

난 내 입력 문자열로 얻을 그것은해야합니다 – gabi939

+0

다음 내 대답은 아래에 언급 한 바와 같이 sscanf() 함수를 사용할 수 있습니다. –

0

는이 문제를 해결하는 방법에는 여러 가지가 있습니다. 간단한 질문은 유효하지 않은 입력을 탐지하는 데 얼마나 많은 코드를 사용해야하는지입니다.

C 표준 라이브러리를 사용하면 코드가 여러 번 문자열을 처리하고 많은 오류를 잡을 수 있습니다.

// Expand the f() signature 
// void luckChoice(char a[]){ 
int luckChoice(const char a[], int *year, int *month, int *day) { 

형식을 확인하십시오. "%n"은 그것이 인 경우 스캔 의 오프셋을 저장합니다. "%*2[0-9]"은 1 또는 2 자리와 일치하지만 결과는 저장하지 않습니다. 이것은 납을 넣는 공백을 허용하는 "%d"'+' 또는 '-'과 다릅니다.

int n = 0; 
    sscanf(a, "%*2[0-9].%*2[0-9].%*4[0-9]%n", &n); 

n 경우 검사가 완전히 성공 제로가 아닌. 그래서 그 문자열의 끝, 다음 - 오 행복 한 날!

if (n > 0 && a[n] == '\0') { 
    sscanf(a, "%d.%d.%d", day, mon, year); 
    // check ranges if desired 
    if (*day < 1 || *day > 31) return 0; 
    if (*mon < 1 || *mon > 12) return 0; 

    // additional checks 
    TDB_Code(); 

    return 1; // success 
    } 
    return 0; // failure 
}