닌자고양이
[C/C++] scanf 패턴 매칭 "%[charset]" 본문
%[character-set] // 허용 문자세트 지정. 허용 문자 이외의 문자가 입력되면 그 이전까지 문자열만 추출 %[^character-set] // 비허용 문자세트 지정. 비허용 문자가 입력되면 그 이전까지 문자열만 추출
포맷 예
%[ab ] // 문자 리스트 (a,b,공백 에 매칭) %[a-c] // 문자 범위 (a,b,c 에 매칭) %[a-cd1-3] // 리스트와 범위 조합 (a,b,c, d, 1,2,3 에 매칭) %[^\r\n] // 제외식 (개행, 리턴 문자 이전까지 매칭)
] - ^ 를 문자세트에 지정하려면
] 를 매칭 문자로 지정하려면 ]문자를 두번 써준다. %[abc]]] - 를 매칭 문자로 지정하려면 맨 마지막에 써준다. %[abc-] ^ 를 비허용 문자로 지정할 때에는 그대로 쓰면 된다. %[^^] ^ 를 허용 문자로 지정하려면 %[a^] 처럼 첫번째 자리를 피해서 써주면 되는데 ^문자만 허용하려면 첫번째 자리에 절대 입력되지 않을 문자를 넣어주면 된다. 예들 들어 아스키 텍스트 입력을 받을 때에는 제어코드 0x01을 넣어줄 수 있다. [\1^] 그러나 제어 문자가 포함될 수 있는 바이너리 파일을 읽을 때에는 완벽한 방법이 없다.
코드 예) 콤마 앞에 까지만 문자열 변수로 입력 받기
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { char str[100]; if (scanf("%[^,]", str) == 1) printf("%s\n", str); } /* 입력: Hello,World 출력: Hello */
코드 예) 콤마로 구분된 두 개의 문자열 입력 받기
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { char str1[100], str2[100]; if (scanf("%[^,]%*c%[^\n]", str1, str2) == 2) printf("%s\n%s\n", str1, str2); } /* 입력: Hello,World 출력: Hello World */
패턴 매칭은 입력 종료시 마지막 문자 매칭이 성공한 것으로 처리되므로
마지막 문자(\n)를 확실히 체크해야 한다면 아래처럼 할 수 있다.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { char str1[100], str2[100], c; if (scanf("%[^,]%*c%[^\n]%c", str1, str2, &c) == 3) printf("%s\n%s\n", str1, str2); }
'C C++' 카테고리의 다른 글
[C/C++] 문자열 이스케이프 시퀀스 (0) | 2021.03.12 |
---|---|
[C/C++] 반복문 없이 정수의 10진수 자릿수 구하기 (0) | 2020.10.04 |
[C/C++] 문자열 분리 (strpbrk, strtok, find_first_of 사용) (0) | 2020.10.03 |
[C++] ifstream 으로 텍스트 파일 읽는 방법들 (0) | 2020.09.20 |
[C/C++] UTF-8 텍스트 파일 읽는 방법들 (0) | 2020.09.18 |