본문 바로가기

Programming/C&CPP

가변 인자 함수의 사용법(vprintf, vsprintf)

반응형

가변 인자 함수의 내부 구조에 이어서 가변 인자 함수의 사용법을 보도록 하겠습니다.

가변 인자 함수의 내부 구조는 다음과 같은 링크에서 확인이 가능합니다.

2014/12/07 - [Programming/C&C++] - 가변 인자(Variable Arguments) 내부 구조

printf와 유사한 형식으로 문자를 조립해 주는 다음과 같은 함수가 존재합니다.

int __cdecl vprintf(const char * _Format,  va_list _ArgList);
int __cdecl vsprintf(char * _Dest, const char * _Format, va_list _Args);

vprintf는 printf와 유사한 동작 방식이고 vsprintf는 sprintf와 유사한 동작 방식입니다.

다음의 소스 코드를 컴파일해서 실행해 보도록 하겠습니다.

#include <stdarg.h>
#include <stdio.h>

void MyVarFunc(char* szFormat, ...)
{
	va_list lpStart;
	va_start(lpStart, szFormat);

	vprintf(szFormat, lpStart);

	va_end(lpStart);
}

int main()
{
	int a = 5, b = 4;
	MyVarFunc("%d + %d = %d\n", a, b, a + b);
	return 0;
}

실행한 결과는 다음과 같습니다.

가변 인자 함수를 하나 생성하였고 printf와 동일한 형태로 포맷 문자열과 인자를 전달합니다.

그리고 vprintf를 사용하였는데 간단하게 가변 인자의 시작 지점을 전달받아서 넣으면 됩니다.

그러면 알아서 문자열을 조립해주고 결과를 화면에 출력합니다.

하지만 Windows 개발 환경에서는 printf를 사용하지 않고 주로 sprintf 등의 함수를 사용합니다.

그렇기 때문에 가변 인자 함수를 사용할 때 vsprintf 함수를 더 많이 사용하게 될 것입니다.

vsprintf 함수는 조립된 문자열을 화면이 아닌 버퍼에 전달받습니다.

vsprintf 사용법은 다음과 같습니다.

#include <stdarg.h>
#include <stdio.h>

void MyVarFunc(char* szFormat, ...)
{
	char szBuf[1024] = {0, };

	va_list lpStart;
	va_start(lpStart, szFormat);

	vsprintf(szBuf, szFormat, lpStart);

	printf(szBuf);

	va_end(lpStart);
}

int main()
{
	int a = 5, b = 4;
	MyVarFunc("%d + %d = %d\n", a, b, a + b);
	return 0;
}

거의 유사하지만 vsprintf는 szBuf에 조립된 문자열을 넣고 printf를 통해 출력합니다.

결과는 동일하게 화면에 표시됩니다.

vsprintf 함수는 로그를 작성할 때나 에러 메시지를 텍스트와 함께 화면에 출력하고 싶을 때 사용합니다.

포맷 문자열과 함께 다양한 값을 추가로 받아서 조립하는 것이 가능하기 때문입니다.

가변 인자의 내부 동작 방식을 몰라도 개발을 하는데 지장은 없지만 기본적이 동작 원리를 아는 것이

좀 더 나은 프로그래밍을 가능하게 하고 좋은 학습이 될 수 있습니다.

마지막으로 vsprintf는 Visual Studio 최신 버전에서는 에러로 처리됩니다.

안전 함수(_s가 붙는 함수 등)를 사용하여 작성하시면 됩니다.


반응형