C 언어의 표준 입출력 라이브러리(stdio.h)에는 화면이나 파일이 아닌 문자열을 대상으로 데이터를 읽고 쓰는 두 가지 유용한 함수가 있습니다. 바로 sscanf()와 sprintf()입니다. 이름 앞에 붙은 's'는 string(문자열)을 의미하며, 각각 scanf()와 printf()의 문자열 버전이라고 이해하면 쉽습니다.
sscanf() 함수란?
sscanf()는 하나의 문자열로부터 형식에 맞춰 데이터를 읽어 들여 변수에 저장하는 함수입니다. 사용자 입력이 아닌 이미 만들어진 문자열을 파싱(parsing)할 때 특히 유용합니다.
문법
sscanf(string, format_specifier, &var1, &var2, ...);
- string : 데이터를 읽어 올 원본 문자열(char 배열)
- format_specifier : 어떤 형식으로 데이터를 해석할지 지정하는 서식 문자열 (예: %d, %s, %f)
- &var1, &var2 : 읽어 들인 값을 저장할 변수들의 주소
예를 들어 다음 코드는 문자열에서 정수 두 개를 읽어 hours와 minutes 변수에 저장합니다.
sscanf(string, "%d%d", &hours, &minutes);
sprintf() 함수란?
sprintf()는 반대로 변수나 값들을 지정한 형식에 맞춰 문자열에 기록(저장)하는 함수입니다. printf()처럼 화면에 출력하지 않고 결과를 문자열 버퍼에 담아두기 때문에, 로그 메시지 생성이나 문자열 조합 등에 널리 활용됩니다.
문법
sprintf(string, format_specifier, var1, var2, ...);
- string : 결과가 저장될 목적지 문자열(char 배열)
- format_specifier : 출력 형식을 지정하는 서식 문자열
- var1, var2 : 문자열에 기록할 값들
예시:
sprintf(value, "cube of two is %d and square of two is %d\n", 2*2*2, 2*2); // value = "cube of two is 8 and square of two is 4"
sscanf() 실습 예제
다음 예제는 공백으로 구분된 문자열에서 단어 두 개를 각각 분리해 저장합니다.
#include<stdio.h>
int main(){
char instring[] = "Tutorials Point";
char outstring[50], string1[10], string2[10];
sscanf(instring, "%s %s", string1, string2);
printf("%s\n", string1);
printf("%s", instring);
return 0;
}
실행 결과
Tutorials Tutorials Point
위 코드에서 sscanf()는 instring의 첫 번째 단어 "Tutorials"를 string1에, 두 번째 단어 "Point"를 string2에 저장합니다. 따라서 string1만 출력하면 "Tutorials"가 나오고, 원본 문자열 전체를 출력하면 "Tutorials Point"가 그대로 출력됩니다.
sprintf() 실습 예제
다음 예제는 두 수의 합을 계산한 뒤, 그 결과를 하나의 문장 형태의 문자열로 만들어 출력합니다.
#include <stdio.h>
int main(){
char value[50];
int p = 20, q = 30, r;
r = p + q;
sprintf(value, "adding two numbers %d and %d the result is %d", p, q, r);
printf("%s", value);
return 0;
}
실행 결과
adding two numbers 20 and 30 the result is 50
p와 q의 합인 r(50)까지 포함해 세 개의 정수가 서식 지정자 %d 자리에 순서대로 대입되어, value 배열에 완성된 문장이 저장된 것을 확인할 수 있습니다.
정리 및 주의 사항
sscanf(): 문자열 → 변수 (문자열에서 데이터를 읽어 옴)sprintf(): 변수 → 문자열 (데이터를 문자열에 기록함)- 두 함수 모두 printf/scanf 계열과 동일한 서식 지정자(%d, %s, %f 등)를 사용합니다.
sprintf()사용 시 결과 문자열이 저장될 배열의 크기를 충분히 크게 잡아야 버퍼 오버플로우를 방지할 수 있습니다. 안전성을 높이려면 크기를 제한하는snprintf()사용을 권장합니다.