Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

닌자고양이

[C/C++] scanf 패턴 매칭 "%[charset]" 본문

C C++

[C/C++] scanf 패턴 매칭 "%[charset]"

닌자고양이 2021. 3. 12. 22:06

 

%[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);
}

 

Comments