Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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 31
Tags
more
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