살아가는 이야기

scanf %n과 sscanf 본문

컴퓨터, 풀어그림

scanf %n과 sscanf

우균 2011. 4. 8. 14:28
scanf 함수에서 %n 형식 지정자가 있다. %n은 읽은 문자 개수를 리턴하는 기능이다. 예를 들어서 int 변수 n과 x에 대해 다음과 같이 scanf를 호출했다고 하자.

scanf("%d%n", &n, &x); 

표준 입력으로 1을 입력했다면 n은 1, x는 1이 되지만 12를 입력했다면 n은 12, x는 2가 된다. %d는 부호도 판별한다. 따라서 +1을 입력했다면 n은 1이 되지만 x는 2가 된다.

형식문자열 지정자 %n은 sscanf에서 진가를 발휘한다. sscanf는 문자열을 입력 스트림으로 간주하여 scanf를 수행한다. 그런데 같은 문자열에 대해 sscanf를 반복하여 사용하려면 scan 시작 지점을 변경해 주어야 한다. 따라서 %n으로 받은 값만큼 시작 지점을 이동시키면 된다. 다음 예를 보자.

while (fgets(line, MAX, stdin) != NULL) {
    for (char *p = line; sscanf(p, "%d%n", &n, &x) == 1; p+=x) { 
        assert(i < ARRLEN); 
        a[i++] = n;
    } 
    // a를 처리하는 부분 
}
 
이 예에서는 여러 줄을 읽어 가며 각 줄에 있는 여러 정수를 반복하여 읽고 있다. 이런 기법을 이용하면 한 줄에 있는 데이터 레코드를 쉽게 분석할 수 있다. 예컨대 CSV 파일 같은 것을 쉽게 처리할 수 있다.
 
Comments