본문 바로가기
프로그래밍/C++

C++ ] 가변인자 받아서 string 또는 CString으로 출력하기

by eteo 2023. 9. 24.

 

 

 

가변인자 받아서 string으로 출력하기

 

 

vsnprintf() 함수는 실제로 버퍼에 출력하지 않고도 필요한 버퍼 크기를 계산할 수 있으므로 char[] 를 사용하지 않고 string 자체의 내부 버퍼를 사용할 수 있다.

 

vsnprintf()실제로 버퍼에 출력하지 않고도 필요한 버퍼 크기를 계산할 수 있으므로 일반적으로char[] 별도의 버퍼가 전혀 필요하지 않고 크기를 계산 std::string하고 해당 크기에 할당한 다음 std::string출력을 위해 의 자체 내부 버퍼를 사용하면 됩니다. , 예:

 

 

string vString(const char* format, ...)
{
	string line;
	
	va_list args;
	va_start(args, format);

	int len = vsnprintf(nullptr, 0, format, args);
	line.resize(len + 1);
	vsnprintf(&line[0], len + 1, format, args);
	line.resize(len);
	va_end(args);
	return line;
}

int main(void)
{
	string str = vString("%s %d %0.2f", "hello", 10, 1.23);
	cout << str << endl;
	cout << "str size : " << str.size() << endl;

	return 0;
}

 

vsnprintf()로 변환된 문자열의 길이를 확인하고 len + 1만큼 버퍼를 확보해 null문자까지 복사한 다음 null 문자를 제외하고 resize() 한다.

 

 

 

참고로 string은 기존의 C스타일 문자열과 다르게 그 길이 정보가 string 클래스 저장되어 있어 '\0'을 찾지 않아도 length() 또는 size() 함수를 통해 문자열의 끝을 알 수 있다. 하지만 '\0'로 끝나는 C스타일 문자열과의 호환성을 위해 메모리에 '\0'을 포함하여 문자열을 저장하며, string의 범위를 넘어 '\0'에 접근하려 하는걸 허용하지 않을 뿐이다.

 

 

 

 

 

 

 

 

 

가변인자 받아서 CString으로 출력하기

 

CString에는 FormatV라는 메서드가 제공된다.

 

CString vCString(const char* format, ...)
{
	CString line;
	va_list args;
	va_start(args, format);
	line.FormatV(format, args);
	va_end(args);
	
	return line;
}


int main(void)
{
	CString cstr = vCString("%s %d %0.2f", "hello", 10, 1.23);
	cout << cstr << endl;
	cout << "cstr size : " << cstr.GetLength() << endl;

	return 0;
}