sscanf는 원하는 형식의 문자열에서 특정 데이터를 추출할 때 사용할 수 있다. C 표준 라이브러리에 포함된 함수로, 문자열에서 데이터를 형식에 맞게 읽어서 변수에 저장하는 기능을 수행한다.이 함수는 scanf 함수와 유사하지만 입력을 표준 입력(stdin)이 아닌 문자열에서 받는다는 점이 다르다.
sscanf의 기본 원형은 다음과 같다.
int sscanf(const char *str, const char *format, ...);
str: 데이터를 읽어들일 문자열
format: 데이터를 읽기 위한 형식을 지정하는 문자열
...: 형식에 따라 저장될 변수의 주소를 가변 인자로 전달
그런데 여기서 왜 sscanf 앞에 int를 붙이는걸까? 그 이유는 문자열 형식 지정자의 수와 일치하는지 반환해서 제대로 동작하는지 확인하기 위해서 이다.
char input[] = "25 179.5 John Doe";
int age;
float height;
char name[100];
int result = sscanf(input, "%d %f %s", &age, &height, name);
위 예제에서 제대로 동작한다면 result 에는 형식 지정자가 3개니까 3이 저장될 것이다.
if문을 사용해서 제대로 동작하는지 확인할 수 도 있다.
if (sscanf(quiz[i], "%d %c %d = %d", &left, &op, &right, &result) == 4)
참고:
sscanf에서 사용할 수 있는 형식 지정자는 다양하며, 대표적인 몇 가지는 아래와 같다.
%d: 정수를 읽음
%f: 부동 소수점 숫자를 읽음
%s: 문자열을 읽음
%c: 단일 문자를 읽음
%x: 16진수 숫자를 읽음
%o: 8진수 숫자를 읽음
sscanf 사용 시 가장 주의해야 할 점은 버퍼 오버플로이다. 예를 들어 %s 지정자를 사용할 때는 버퍼 크기를 제한하는 것이 좋다
예를 들면, char buffer[10]; 버퍼가 있을 때, 이 버퍼에 데이터를 읽을 경우 %9s 형식 지정자를 사용하여 버퍼 크기를 초과하지 않도록 할 수 있다. 이렇게 하면 sscanf는 최대 9문자까지만 읽고 마지막에 널 문자를 추가하여 버퍼 오버플로우를 방지한다.
char str[10];
sscanf(input, "%9s", str); // 최대 9개 문자 읽기