살아가는 이야기
scanf %n과 sscanf 본문
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으로 받은 값만큼 시작 지점을 이동시키면 된다. 다음 예를 보자.
이 예에서는 여러 줄을 읽어 가며 각 줄에 있는 여러 정수를 반복하여 읽고 있다. 이런 기법을 이용하면 한 줄에 있는 데이터 레코드를 쉽게 분석할 수 있다. 예컨대 CSV 파일 같은 것을 쉽게 처리할 수 있다.
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);
assert(i < ARRLEN);
a[i++] = n;
}
// a를 처리하는 부분
}
// a를 처리하는 부분
}
Comments