티스토리 뷰
개요
sscanf는 c언어 레퍼런스 함수로, 제공된 버퍼에서 형식화된 자료형을 읽어오는 함수이다.
함수의 원형은 다음과 같다.
#include <stdio.h> |
매개변수로 넘겨진 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"; |
[]
sscanf는 [ ]대괄호 안에 값을 넣어 읽을 문자열을 선택적으로 문자열에 저장하는 기능도 제공한다.
예를들어 ,로 구분된 다음과 같은 문자열을 단어별로 파싱하고 싶다면,
"apple,banana,orange"
format을 "%[^’,’],%[^’,’],%s" 라고 입력하면 된다. 여기서 %[^’,’]는 ,(콤마)를 제외한, 콤마 까지의 문자열을 의미한다.
%[^\n] 등으로 응용하여 개행문자까지의 문자열을 읽어오도록 할 수도 있다.
대괄호를 사용해서 특정 문자셋만 저장하도록 할 수도 있다.
%[a-z] 는 소문자 a부터 z까지의 문자들만 저장하겠다는 뜻으로 범위에서 벗어나는 문자를 만날 때 까지 읽어서 저장한다.
char message[126] = "iamaBoy man"; |
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을 넣어줘도 된다.
char message[128] = "iamaBoy"; |
'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
- JSP
- 드라마
- 데이터베이스
- 국내여행
- 알고리즘
- 운영체제
- swift
- C++
- OS
- winsock
- Git
- ios
- Cocos2d-x
- ue4
- Java
- game
- C
- C/C++
- SHADER
- 수학
- DesignPattern
- database
- SwiftUI
- Spring
- machine learing
- rxswift
- mongoDB
- 자료구조
- scala
- SOCKET
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |