닌자고양이
[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 |
Comments