- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Link
- 재능이의 돈버는 일기
- StresslessLife
- K_JIN2SM
- 소소한 일상
- My Life Style & Memory a Box
- Blog's generation
- 공감 스토리
- 취객의 프로그래밍 연구실
- Love Me
- Dream Archive
- 세상에 발자취를 남기다 by kongmingu
- hanglesoul
- 카마의 IT 초행길
- 느리게.
- 미친듯이 즐겨보자..
- Joo studio
- Gonna be insane
- 악 다 날아갔어!! 갇대밋! 왓더...
- xopowo05
- 맑은공기희망운동
- 엔지니어 독립운동
- 혁준 블로그
- Simple in Complex with Simple
- 무의식이 의식을 지배한다
드럼치는 프로그래머
[C/C++] C 언어 레퍼런스 - sscanf 함수 본문
sscanf
문자열에서 형식화 된 데이터를 읽어온다.
str 에서 데이터를 형식 문자열(format)에서 지정하는 바에 따라 읽어와 그 데이터를 뒤에 부수적인 인자들이 가리키는 메모리 공간에 저장하게 된다. 이 때, 데이터가 저장되는 방식 역시 형식 문자열에 의해 결정된다.
str
C 문자열로 sscanf 함수가 데이터를 얻어올 문자열이다.
format
C 문자열로 다음의 것들을 포함하고 있다.
sscanf 함수의 타입 지정자들
부수적 인자
형식 문자열의 정의된 순서대로 각 형식 지정자는 이에 대응하는 인자가 가리키는 메모리 공간에 데이터를 집어넣는다. 이 때, 부수적 인자들은 모두 포인터의 형태 (주소값) 여야 한다. 예를 들어서 i 라는 변수에 값을 대입하려면 인자로 &i 를 전달해야 한다. 절대로 i 를 전달하면 안된다.
예를 들면 다음과 같다.
보통 우리는 문자열을 수로 바꿀 때 atoi 함수를 호출한다. 이는 stdlib.h 에 정의되어 있는데 이를 사용하게 되면 불필요하게 stdlib.h 를 포함해야 하므로 상당히 불편하게 된다. 하지만 sscanf 함수를 사용하면 단순히 stdio.h 에서 문자열을 수로 바꿀 수 있다.
실행 결과
위와 같이 str 에서 sscanf 함수로 %d 형식, 즉 정수 형식으로 수를 읽어오면 이 값을 i 에 저장하게 된다.
위 함수의 장점은 %d 뿐만이 아니라 %o 나 %f, %x 등이 가능하기 때문에 팔진수나 부동소수점 수, 16 진수 들도 모두 동일한 방법으로 입력받을 수 있다. 반면에 atoi 계열 함수들은 atoi, atof 등 세분화 되어 있기 때문에 불편한 면이 있다.
입력 성공 시에 이 함수는 읽어들인 것의 개수를 리턴한다. 물론, 0 이 리턴될 수 도 있다. (이 경우에는 str 에서 format 에서 지정한 형식과 일치하는 데이터가 없어서 아무것도 읽어들이지 않은 경우 발생한다. 아래의 EOF 가 리턴되는 경우와 조금 다르다)
만일 어떠한 데이터도 성공적으로 읽기 전에 입력이 실패한다면 EOF 가 리턴된다.
int main ()
{
char sentence []="Rudolph is 12 years old";
char str [20];
int i;
sscanf (sentence,"%s %*s %d",str,&i);
printf ("%s -> %d\n",str,i);
return 0;
}
실행 결과
[출처] http://itguru.tistory.com/67
#include <stdio.h> // C++ 에서는 <cstdio>
int sscanf ( const char * str, const char * format, ...);
int sscanf ( const char * str, const char * format, ...);
문자열에서 형식화 된 데이터를 읽어온다.
str 에서 데이터를 형식 문자열(format)에서 지정하는 바에 따라 읽어와 그 데이터를 뒤에 부수적인 인자들이 가리키는 메모리 공간에 저장하게 된다. 이 때, 데이터가 저장되는 방식 역시 형식 문자열에 의해 결정된다.
인자 |
C 문자열로 sscanf 함수가 데이터를 얻어올 문자열이다.
format
C 문자열로 다음의 것들을 포함하고 있다.
- 공백 문자 (Whitespace character 이라 부르며, 개행 문자(\n), 탭 문자, 띄어쓰기(' ') 를 일컫는다) : fscanf 함수는 비-공백 문자를 읽어들이기 전까지 읽혀지는 모든 공백 문자들을 무시한다.
- 비-공백 문자 (Non whitespcae character), 단 % 를 제외한다 : 공백 문자가 아니거나 형식 지정자에 포함되지 않는 것들은 함수로 하여금 다음 문자를 스트림에서 읽어 들이고 이와 이 비-공백 문자와 비교하여 같다면 버리고 다음 문자와 형식으로 진행한다. 만일 다르다면 함수가 종료되고, 스트림에서 읽혀지지 않은 다른 문자들은 모두 남아있게 된다.
- 형식 지정자 : 이는 % 로 지정되는 것들로 스트림에서 어떠한 형식으로 데이터를 읽어오고, 또 각각의 형식 지정자에 대응되는 인자에 어떠한 형식으로 저장할 지에 대해 결정한다. 형식 지정자는 아래와 같은 꼴로 생겼다.
%[*][폭(width)][한정자(modifiers)]타입(type)
* | 데이터를 str (우리가 데이터의 소스로 지정한 문자열)에서 받아들이지만 무시된다. 물론, 이에 대응되는 인자에는 받아들인 데이터가 저장되지 않고 이 인자는 다음 형식 태그에 대응된다. 예를 들어 sscanf(str, "%*d%d", i,j); 의 경우 먼저 수를 입력하더라도 %*d 형식이므로 무시 된다. 그 다음 수를 입력하면 %d 형식 태그가 j 가 아닌 i 에 대응되어 i 에 그 다음 입력한 수가 들어가게 된다. 이 때 j 에는 아무런 값도 들어가지 않는다. |
폭 |
str 에서 읽어들일 최대 문자 수를 지정한다. 예를 들어 sscanf(str, "%10s", str); 로 했을 경우 str 에서 최대 10 문자를 읽어와 str 에 저장한다. 이 때 주의할 점은 str 에는 NULL 문자가 들어갈 수 있는 충분한 공간이 남아 있어야 한다. |
한정자 | 입력받는 데이터의 크기를 지정한다. int (d, i, n), unsigned int (o, u, x) float (e, f, g) 형에 대해 입력받는 데이터의 크기를 설정할 수 있다.
|
타입 |
데이터를 어떠한 형식으로 혹은 어떠한 값만을 읽어들어야 할 지에 대해 지정해준다. 아래 표를 참고. |
sscanf 함수의 타입 지정자들
타입 | 대응되는 입력 방식 |
대 응되는 인자의 형태 |
---|---|---|
c | 단일 문자: 하나의 문자를 읽어들인다. 만일 폭에 1 이 아닌 값으로 지정되어 있다면 (기본값은 1) 함수는 폭 만큼의 문자를 읽어들인 후 이에 대응하는 인자가 가리키는 메모리 공간에 저장한다. 이 때 마지막에는 널 문자를 붙이지 않는다. |
char * |
d | 십진법 으로 표현된 정수: 말그대로 십진법으로 쓰인 정수로, + 나 - 기호로 시작할 수도 있다. | int * |
e,E,f,g,G | 부동 소수점: 소수점을 포함하고 있는 소수(decimal number) 로 + 나 - 기호로 시작할 수도 있으며, e 나 E 문자(10 의 지수를 나타내기 위해)를 포함할 수 도 있다. -732.103 , 12e-4, +123.10 은 모두 올바른 입력이다. |
float * |
o | 8진법으로 표현된 정수 |
int * |
s | 문자 열: 공백문자를 찾을 때 까지 문자들을 읽어들인다. |
char * |
u | 부호가 없는 십진법으로 표현된 정수 |
unsigned int * |
x,X | 16진법으로 표현된 정수 |
int * |
부수적 인자
형식 문자열의 정의된 순서대로 각 형식 지정자는 이에 대응하는 인자가 가리키는 메모리 공간에 데이터를 집어넣는다. 이 때, 부수적 인자들은 모두 포인터의 형태 (주소값) 여야 한다. 예를 들어서 i 라는 변수에 값을 대입하려면 인자로 &i 를 전달해야 한다. 절대로 i 를 전달하면 안된다.
예를 들면 다음과 같다.
char str[30]="word";
char c;
sscanf(str, "%c", &c);
char c;
sscanf(str, "%c", &c);
sscanf 함수를 이용해서 문자열을 수로 바꾸기 |
보통 우리는 문자열을 수로 바꿀 때 atoi 함수를 호출한다. 이는 stdlib.h 에 정의되어 있는데 이를 사용하게 되면 불필요하게 stdlib.h 를 포함해야 하므로 상당히 불편하게 된다. 하지만 sscanf 함수를 사용하면 단순히 stdio.h 에서 문자열을 수로 바꿀 수 있다.
#include <stdio.h>
int main()
{
char str[30]="1234";
int i;
sscanf(str, "%d", &i);
printf("Number from : '%s' \n", str);
printf("number : %d \n", i);
return 0;
}
int main()
{
char str[30]="1234";
int i;
sscanf(str, "%d", &i);
printf("Number from : '%s' \n", str);
printf("number : %d \n", i);
return 0;
}
실행 결과
위와 같이 str 에서 sscanf 함수로 %d 형식, 즉 정수 형식으로 수를 읽어오면 이 값을 i 에 저장하게 된다.
위 함수의 장점은 %d 뿐만이 아니라 %o 나 %f, %x 등이 가능하기 때문에 팔진수나 부동소수점 수, 16 진수 들도 모두 동일한 방법으로 입력받을 수 있다. 반면에 atoi 계열 함수들은 atoi, atof 등 세분화 되어 있기 때문에 불편한 면이 있다.
리턴값 |
입력 성공 시에 이 함수는 읽어들인 것의 개수를 리턴한다. 물론, 0 이 리턴될 수 도 있다. (이 경우에는 str 에서 format 에서 지정한 형식과 일치하는 데이터가 없어서 아무것도 읽어들이지 않은 경우 발생한다. 아래의 EOF 가 리턴되는 경우와 조금 다르다)
만일 어떠한 데이터도 성공적으로 읽기 전에 입력이 실패한다면 EOF 가 리턴된다.
실행 예제 |
/*
sentence 로 부터 Rudolph 와 12 라는 수를 sscanf 함수를 이용해 추출한다.
이 예제는 http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/
에서 가져왔습니다.
*/
#include <stdio.h>sentence 로 부터 Rudolph 와 12 라는 수를 sscanf 함수를 이용해 추출한다.
이 예제는 http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/
에서 가져왔습니다.
*/
int main ()
{
char sentence []="Rudolph is 12 years old";
char str [20];
int i;
sscanf (sentence,"%s %*s %d",str,&i);
printf ("%s -> %d\n",str,i);
return 0;
}
실행 결과
연관된 함수 |
[출처] http://itguru.tistory.com/67
'★─Programing > ☆─C | C++' 카테고리의 다른 글
[C/C++] callback 함수의 이해 (4) | 2011.11.01 |
---|---|
[C/C++] Visual Studio 2005 Warnning Deprecated Function (0) | 2011.11.01 |
[C/C++] CMap 사용 예제 (0) | 2011.06.13 |
[C/C++] scanf %n과 sscanf (0) | 2011.05.23 |
[C/C++] 실수를 실수로 반올림 함수, 자릿수 지정; Round to Double Function (0) | 2010.03.02 |
Comments