[C/C++] string wstring format 사용하기
반응형
std::string assign format string
std::string 에는 format을 지정하여 입력하는 기능이 따로 없습니다. 그렇기 때문에 MFC에서 CString.Format
처럼 간편하게 쓸만한걸 직접 만들어 사용하거나 boost::format
을 사용하는 방법이 있습니다. 그중 만들어 사용하는 몇 가지를 소개하겠습니다.
예전부터 내려오는 방법으로 parameter에 ...
을 두어 가변 인자를 전달받는 방법입니다.
가변 인자를 전달받기 위해서는 가장 중요한 Calling Convention
이 __cdecl
이어야 한다는 점입니다.
Calling Convention이 궁금하신 분들은 아래 링크를 참조해주세요
format string sample 1
가변 인자를 va_list로 순회하여 사용한 방법이고, sample2 방법은 snprintf를 사용한 방법입니다. n이 붙지 않은 sprintf는 스택 오버플로우 등 수많은 취약점에 이용된 API이기 때문에 절대 사용 금지입니다!
#include <stdarg.h>
std::string format_string(const std::string fmt, ...) {
int size = ((int)fmt.size()) * 2;
std::string buffer;
va_list ap;
while (1) {
buffer.resize(size);
va_start(ap, fmt);
int n = vsnprintf((char*)buffer.data(), size, fmt.c_str(), ap);
va_end(ap);
if (n > -1 && n < size) {
buffer.resize(n);
return buffer;
}
if (n > -1)
size = n + 1;
else
size *= 2;
}
return buffer;
}
int main()
{
std::string test_message = format_string("%d %lf %s %#x\n", 10, 10.5, "test message", 12345678);
printf(test_message.c_str());
system("pause");
}
format string sample 2
#include <memory>
#include <string>
template<typename ... Args>
std::string format_string(const std::string& format, Args ... args)
{
size_t size = snprintf(nullptr, 0, format.c_str(), args ...) + 1;
std::unique_ptr<char[]> buffer(new char[size]);
snprintf(buffer.get(), size, format.c_str(), args ...);
return std::string(buffer.get(), buffer.get() + size - 1);
}
int main()
{
std::string test_message = format_string("%d %lf %s %#x\n", 10, 10.5, "test message", 12345678);
printf(test_message.c_str());
system("pause");
}
TIP
만약 declared
처리된 sprintf를 사용하고 싶은 경우 빌드 할때마다 warning 표시가 나오게 됩니다. 그럴 땐 다음과 같이 #pragma warning(disable : 4996) 을 이용하여 warning message를 제거할 수 있습니다. 위 코드는 snprintf를 사용하기 때문에 warning 4996이 나타나지 않습니다.
#pragma warning(disable : 4996)
std::string을 std::wstring으로 변환하고 싶은 경우 다음 포스팅을 참조하세요
반응형
'⌨ DEVELOPMENT > C++' 카테고리의 다른 글
[C++] Boost ASIO를 이용한 안전한 TCP/IP 비동기 소켓 서버 예제 (5) | 2019.08.07 |
---|---|
[MFC] Dialog Load GIF image (5) | 2019.07.28 |
[C++] How to use GDIPlus Library in c++ (0) | 2019.07.28 |
[MFC] 다이얼로그의 윈도우 소멸자 호출 순서 (1) | 2019.07.28 |
[C/C++] 윈도우10 Boost 최신버전 설치 및 사용법 (13) | 2019.07.27 |
[C/C++] URL 전달을 위한 urlencode & urldecode (1) | 2019.07.11 |
[C/C++] process crash 로그 및 덤프 남기기 (access violation) (0) | 2019.07.06 |
[C/C++] convert string, wstring, utf-8 (9) | 2019.07.06 |
댓글
이 글 공유하기
다른 글
-
[C++] How to use GDIPlus Library in c++
[C++] How to use GDIPlus Library in c++
2019.07.28 -
[MFC] 다이얼로그의 윈도우 소멸자 호출 순서
[MFC] 다이얼로그의 윈도우 소멸자 호출 순서
2019.07.28 -
[C/C++] 윈도우10 Boost 최신버전 설치 및 사용법
[C/C++] 윈도우10 Boost 최신버전 설치 및 사용법
2019.07.27 -
[C/C++] URL 전달을 위한 urlencode & urldecode
[C/C++] URL 전달을 위한 urlencode & urldecode
2019.07.11