C++ 프로그래밍

C++ wstring용 가변인자 포맷(format) 스트링 만들기

하늘흐늘 2021. 10. 8. 13:40
반응형

C/C++로 로그(log) 같은 함수를 만들거나 변수들을 문자열로 만들고 싶을 때가 있다. 이런 때 쉽게 사용할 수 있는 함수이다. 여기서는 기본이 되는 함수의 소스를 소개할까 한다.
  
아래 함수는 wstring을 string으로 wchar_t을 char로 _vsnwprintf_s을 char용으로 수정하면 string용으로 수정할 수도 있다. _vsnwprintf_s은 윈도우용 API인 관계로 Linux 혹은 Unix에서는 해당 OS에 맞는 함수로 수정하면 Linux나 Unix에서 사용할 수 있다. 여기서는 소스가 복잡해지는 관계로 string용이나 윈도우 외의 OS용으로는 만들지 않았다. 또한 다른 가변 인자 함수에서의 사용을 위하여 주요 로직을 가지고 있는 함수의 인자는 va_list로 처리하였다.
    

std::wstring format(const std::wstring fmt, va_list args)
{
	int size = ((int)fmt.size()) * 2;
	wchar_t* buffer = nullptr;

	while (true)
	{
		if (buffer != nullptr)
		{
			delete[] buffer;
		}
		buffer = new wchar_t[size + 1];
		int n = _vsnwprintf_s(buffer, size+1, size, (wchar_t*)fmt.c_str(), args);

		if (-1 < n && n < size)
		{
			break;
		}
		else
		{
			size *= 2;
		}
	}

	std::wstring result = buffer;
	delete[] buffer;

	return result;
}

std::wstring format(const std::wstring fmt, ...)
{
	va_list args;
	va_start(args, fmt);
	std::wstring result = format(fmt, args);
	va_end(args);

	return result;
}
반응형