2017-01-27 3 views
1

그래서 sscanf() 함수가 실제로 이상하게 작동하는 것을 발견했습니다. 나는 날짜의 특정 문자열을 구문 분석하는 다음과 같은 코드가 있습니다sscanf()의 일관성없는 동작

#include <stdio.h> 

int main() 
{ 
    int year, month, day; 

    sscanf("20151106","%4i%2i%2i",&year,&month,&day); 
    printf("Year: %04i\tMonth: %02i\tDay: %02i\n",year,month,day); 

    sscanf("20151107","%4i%2i%2i",&year,&month,&day); 
    printf("Year: %04i\tMonth: %02i\tDay: %02i\n",year,month,day); 

    sscanf("20151108","%4i%2i%2i",&year,&month,&day); 
    printf("Year: %04i\tMonth: %02i\tDay: %02i\n",year,month,day); 

    sscanf("20151109","%4i%2i%2i",&year,&month,&day); 
    printf("Year: %04i\tMonth: %02i\tDay: %02i\n",year,month,day); 

    sscanf("20151110","%4i%2i%2i",&year,&month,&day); 
    printf("Year: %04i\tMonth: %02i\tDay: %02i\n",year,month,day); 

    sscanf("20151111","%4i%2i%2i",&year,&month,&day); 
    printf("Year: %04i\tMonth: %02i\tDay: %02i\n",year,month,day); 


    return 0; 
} 

을 그리고 출력은 다음과 같다 :

Year: 2015  Month: 11  Day: 06 
Year: 2015  Month: 11  Day: 07 
Year: 2015  Month: 11  Day: 00 
Year: 2015  Month: 11  Day: 00 
Year: 2015  Month: 11  Day: 10 
Year: 2015  Month: 11  Day: 11 

왜 sscanf에서()가 잘못 08. 및 09. 일 분석 하는가?

미리 감사드립니다. 당신이 "나는"사용 "D"하지 않을 때문이다

르그

답변

4

. "i"형식을 사용하는 경우 0x로 시작하는 번호는 기본 16으로 읽히고 0으로 시작하는 번호는 기본 8로 읽습니다.

따라서 01- 07은 기본 8 및 10과 동일하므로 올바른 값이지만 08은 0이고 09는 유효하지 않습니다.

는 예를 들어, "D"지정자를 사용하도록 코드를 변경

:

#include <stdio.h> 

int main() 
{ 
    int year, month, day; 

    sscanf("20151108","%4d%2d%2d",&year,&month,&day); 
    printf("Year: %04d\tMonth: %02d\tDay: %02d\n",year,month,day); 

    return 0; 
} 

출력 :

Year: 2015 Month: 11 Day: 08 
+0

너무 감사합니다, 저에게 많은 도움이! –