스캔셋(Scanset)은 기본적으로 %s와 유사하지만 모든 문자열을 입력받는 것이 아니라 별도로 기술한 범위에 속하는 것들만 골라서 입력을 받는다는 점이 다릅니다. 그리고 그 범위에 속하지 않는 문자가 등장하는 지점에서 입력을 끝내버립니다. %s는 입력 구분을 의미하는 공백 문자를 처리할 수 없었지만 스캔셋을 이용하면 scanf()함수가 gets()함수처럼 작동하게 할 수도 잇습니다.
#include <stdio.h> int main(void) { char szBuffer[32] = { NULL }; scanf("%[A-Z]", szBuffer); puts(szBuffer); scanf("%s", szBuffer); puts(szBuffer); return 0; }
스캔셋은 %[]형식 문자로 기술합니다. 내부적으로 사용자가 입력한 문자열을 스캔셋을 근거로 구문 분석하고 걸러내어 조건에 맞는 문자들을 골라서 저장합니다. 그리고 조건에 맞지 않는 문자가 등장하면 더는 읽어 내지 않고 멈춥니다.
예를들어 "TESTstring"이라고 입력했다면 "TEST"까지만 배열에 저장합니다. 그래서 실행결과는 TEST 후에 버퍼에 남아있는 string이 출력됩니다. 아래의 scanf()함수는 버퍼에 문자열이 남아있기때문에 입력을 받지 못하는 경우입니다.
그리고 읽어내고 싶은 범위를 여럿 명시하고 싶다면 반점(,)을 이용하면 됩니다.
#include <stdio.h> int main(void) { char szBuffer[32] = { NULL }; scanf("%[^A-Z]", szBuffer); puts(szBuffer); scanf("%s", szBuffer); puts(szBuffer); return 0; }
가령 %[A-Z, a-z]라고 명시하면 영문 대문자와 소문자 모두가 범위로 지정됩니다. 만일 공백 문자를 삽입하여 %[ A-Z,a-z]라고 기술하면 공백 문자를 입력의 구분자로 사용하지 않고 일반 문자처럼 그냥 읽어내어 메모리에 저장해줍니다. 또한 ^기호를 이용하면 입력 범위가 아니라 입력받지 않을 범위를 지정할 수 있습니다.
scanf()함수로 gets()함수처럼 사용할수 있다.
#include <stdio.h> int main(void) { char szBuffer[32] = { NULL }; scanf("%[^\n]%*c", szBuffer); puts(szBuffer); gets(szBuffer); puts(szBuffer); return 0; }
%[^\n]이 의미하는 것은 줄 바꿈 문자를 제외한 나머지 모든 문자를 의미합니다. 따라서 gets()함수처럼 공백 문자도 입력받을 수 있습니다. 그리고 이어서 %*c 형식 문자를 조합함으로써 입력 버퍼에 남을 줄 바꿈 문자를 제거함으로써 이후에 나오는 gets()함수에서 키보드로부터 입력을 받을 수 있습니다.
[ 출저 ] - 명강의로 완성하는 C 프로그래밍
'C' 카테고리의 다른 글
[C] - 환경변수 출력 (0) | 2014.09.08 |
---|---|
[C] - const 포인터 사용법 (0) | 2014.09.08 |
[C] - scanf() 함수 (0) | 2014.09.08 |
[C] - getchar(), _getch(), _getche() 차이점 (0) | 2014.09.08 |
[C] - 동적으로 할당된 메모리 크기 알기 (0) | 2014.09.08 |