스캔셋(Scanset)이란?
C 언어의 스캔셋(scanset)은 scanf 계열 함수에서 지원하는 특수한 형식 지정자입니다. %[] 형태로 표현되며, 대괄호 안에는 하나의 문자 또는 여러 개의 문자 집합을 지정할 수 있습니다. 단, 대소문자는 엄격하게 구분됩니다.
스캔셋이 적용되면 scanf() 함수는 대괄호 안에 명시된 문자들만 읽어들이고, 나머지 문자는 모두 무시합니다.
기본 예제
#include<stdio.h>
int main() {
char str[50];
printf("Enter something: ");
scanf("%[A-Z]s", str);
printf("Given String: %s", str);
}
실행 결과
Enter something: HElloWorld
Given String: HE
위 예제에서 스캔셋은 대문자 A~Z만 허용하므로, 소문자로 입력된 문자들은 모두 무시됩니다. 'W' 역시 그 앞에 소문자가 먼저 등장했기 때문에 읽히지 않습니다.
캐럿(^) 기호로 읽기 중단점 설정하기
스캔셋의 첫 번째 위치에 캐럿(^) 기호를 넣으면 동작 방식이 반전됩니다. 즉, 지정한 문자가 처음 나타나는 시점에서 scanf()가 더 이상 읽지 않고 종료합니다.
예제
#include<stdio.h>
int main() {
char str[50];
printf("Enter something: ");
scanf("%[^r]s", str);
printf("Given String: %s", str);
}
실행 결과
Enter something: HelloWorld
Given String: HelloWo
위 코드에서 scanf()는 'r' 문자를 만나는 순간 그 이후의 문자들을 모두 무시하고 입력을 마칩니다.
공백이 포함된 문자열 입력받기
이 기능을 활용하면 scanf()가 공백이 포함된 문자열을 제대로 입력받지 못하는 고질적인 문제를 해결할 수 있습니다. 스캔셋을 %[^\n]으로 지정하면 개행(newline) 문자를 만날 때까지 한 줄 전체의 문자를 모두 읽어들입니다.
예제
#include<stdio.h>
int main() {
char str[50];
printf("Enter something: ");
scanf("%[^\n]s", str);
printf("Given String: %s", str);
}
실행 결과
Enter something: Hello World. This line has some spaces.
Given String: Hello World. This line has some spaces.
이처럼 스캔셋을 잘 활용하면 scanf() 함수의 입력 처리 범위를 유연하게 제어할 수 있습니다. 대문자만 필터링하거나, 특정 문자 앞까지만 읽거나, 공백을 포함한 한 줄 전체를 입력받는 등 다양한 상황에 맞게 응용해 보세요.