티스토리 뷰

Programming/C++

C/C++ - sscanf, sscanf_s

글그리 2017. 1. 23. 23:21

개요


sscanf는 c언어 레퍼런스 함수로, 제공된 버퍼에서 형식화된 자료형을 읽어오는 함수이다.

함수의 원형은 다음과 같다.


#include <stdio.h>

int sscanf(const char* str, const char* format, ...);


매개변수로 넘겨진 str문자열에서 format형식으로 데이터를 읽어서 가변인자들이 가리키는 메모리에 각각 저장한다. 가변인자로 전달하는 값은 읽은 데이터를 저장할 변수의 주소이다.

// scanf를 사용할 때 scanf("%d %d", &i, &j); 처럼 쓰는 것과 같은 원리.

사용하려면 다음 헤더를 추가해야 한다.


C : <stdio.h>

C++ : <cstdio>





Format


sscanf의 format으로 정할 수 있는 문자열은 다음과 같다.


%[*][길이][한정자][데이터 타입]


*

읽기만 하고 무시.



길이

읽을 최대 길이



한정자

저장할 자료형의 크기 (long short 등)

h : short int 또는 unsigned short int (4byte)

l : long int 또는 unsigned long int 또는 double (8byte)

L : long double (16byte)



데이터 타입

scanf의 그것과 같다.

d-정수, f-실수, c-문자, s-문자열 등




*


*은 좀 생소한 표현인데 이 *의 사용방법을 좀 자세히 살펴보자.

예를들어 버퍼에서 원하는 값이 필요없는 문자열들 뒤에 있을 경우, 앞에 있는 필요없는 문자열을 처리할 방법이 있어야 한다.

필요없는 문자열을 저장할 trash 변수를 많이 만들어서 trash변수에 저장하고, 그 다음에 필요한 부분을 받는 방법도 있지만 그만큼 필요없는 메모리가 더 사용되고 코드도 복잡해지므로 좋은 방법은 아닌 것 같다.


*은 버퍼를 읽기는 하지만 무시하므로 이 때 사용하기 좋은 기능이다.


"There are 30 Ducks"


위 문자열에서 앞에있는 There, are를 무시하고, 30이라는 숫자(int)와 Ducks라는 문자열(char[])을 따로 저장하고 싶다면 아래와 같이 사용하면 된다.

char str[] = "There are 30 Ducks";
char animal[10];
int count;

sscanf(str, "%*s %*s %d %s", &count, animal);
// count = 30
// animal = "Ducks"




[]


sscanf는 [ ]대괄호 안에 값을 넣어 읽을 문자열을 선택적으로 문자열에 저장하는 기능도 제공한다.

예를들어 ,로 구분된 다음과 같은 문자열을 단어별로 파싱하고 싶다면,


"apple,banana,orange"


format을 "%[^’,’],%[^’,’],%s" 라고 입력하면 된다. 여기서 %[^’,’]는 ,(콤마)를 제외한, 콤마 까지의 문자열을 의미한다.

%[^\n] 등으로 응용하여 개행문자까지의 문자열을 읽어오도록 할 수도 있다.


대괄호를 사용해서 특정 문자셋만 저장하도록 할 수도 있다.

%[a-z] 는 소문자 a부터 z까지의 문자들만 저장하겠다는 뜻으로 범위에서 벗어나는 문자를 만날 때 까지 읽어서 저장한다.


char message[126] = "iamaBoy man";

char little[10];

sscanf(message, "%[a-z]", little);
// little = "iama"




sscanf_s


vs로 컴파일 한다면 이제 sscanf를 사용하면 에러가 발생한다. sscanf_s를 사용하라는 것인데 다른 _s함수들과 같이 문자열을 읽을 때 저장할 변수의 크기를 입력해주면 된다.

위 코드를 sscanf_s를 사용하는 코드로 바꿔보자.


char message[128] = "iamaBoy";

char little[10];

sscanf_s(message, "%[a-z]", little, sizeof(little));
// sscanf_s(message, "%[a-z]", little, 10);


저장할 little의 크기가 10이기 때문에 10을 넣어줘도 된다.



'Programming > C++' 카테고리의 다른 글

C++11 - std::bind  (0) 2017.09.21
콜백함수 만들기 : 함수 포인터(Function Pointer)  (0) 2017.02.05
C/C++ - assert  (0) 2016.12.28
C/C++ - 가변인자 ...  (0) 2016.11.19
namespace 활용하기  (2) 2016.10.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   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
글 보관함