Superkkt Blog

sscanf 사용 예제

2007/03/07 11:25

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

int
main(void)
{
   char *str = "2007-01-21 12:53:25";
   char dates[50];
   int hour;
   int min;
   int sec;
   int result;

   result = sscanf(str, "%s %d:%d:%d", dates, &hour, &min, &sec);
   if (result != 4)
   {
       fprintf(stderr, "Failed to scanf: %s\n", strerror(errno));
       exit(EXIT_FAILURE);
   }

   printf("%d %s %d:%d:%d\n", result, dates, hour, min, sec);
   return 0;
}

이상하게 sscanf() 왠지 모르게 어렵게 느껴져서 잘 사용을 안했었다. 그러다가 이번에 문자열 파싱하기가 귀찮아서 한번 써봤는데, 내가 생각하던대로 착착 파싱이 되지는 않는것 같다.

우선 위 예제에서 "2007-01-21" 이 부분은 하나의 문자열로 파싱이 되는것 같다. 원래 내가 원했던 바는 아래와 같다.

char *str = "2007-01-21 12:53:25";
char year[5];
char month[3];
char day[3];
int hour;
int min;
int sec;

sscanf(str, "%s-%s-%s %d:%d:%d", year, month, day, hour, min, sec);

요렇게 하면 아래와 같이 파싱이 될 줄 알았는데..

year = "2007";
month = "01";
day = "21";
hour = 12;
min = 53;
sec = 25;

그런데 이렇게는 안되는것 같다. 정수형으로 빼낼 경우에는 내가 생각하는대로 되는것 같은데 문자열로 빼낼때는 공백을 구분자로 해야만 가능한건가? 아무튼 생각되로 안되는군. 역시 이상하게 sscanf()는 어렵게 느껴져..

2007/03/07 11:25 2007/03/07 11:25

trackbacks

trackbacks rss

이 글에는 트랙백을 보낼 수 없습니다

  1. M/D R
    C 세계로 다시 돌아오면서 눈팅으로 몇가지 도움받다가 살짝 도움 드려봅니다. 기본적으로 string파싱은 white space(isspace라는 함수가 참을 돌려주는 경우가 white spcae이며 man isspace해보면 됩니다.)를 만날때까지 하나의 문자열로 인식합니다. 하지만, 2007-01-21 하는 식으로 자릿수가 일정한 경우라면 %4s-%2s-%2s 라는 꽁수를 사용하면 원하는대로 파싱이 가능합니다.
  2. 김기태 2007/03/10 11:51
    M/D R
    아하! 이런 방법이 있었군요. 감사합니다~
  3. M/D R
    우연히 넘기다 발견했습니다. 좀 오래된 포스트지만...

    sscanf(str, "%4[0-9]%*[ -]%2[0-9]%*[- ]%2[0-9] %d:%d:%d", year, month, day, &hour, &min, &sec);

    와 같은 패턴매칭을 이용한 방법도 가능합니다.

Leave a Comment