이 영역을 누르면 첫 페이지로 이동
웬디의 기묘한 이야기 블로그의 첫 페이지로 이동

웬디의 기묘한 이야기

페이지 맨 위로 올라가기

[C/C++] string wstring format 사용하기

웬디의 기묘한 이야기

[C/C++] string wstring format 사용하기

  • 2019.07.27 16:44
  • ⌨ DEVELOPMENT/C++
반응형

std::string assign format string

std::string 에는 format을 지정하여 입력하는 기능이 따로 없습니다. 그렇기 때문에 MFC에서 CString.Format처럼 간편하게 쓸만한걸 직접 만들어 사용하거나 boost::format을 사용하는 방법이 있습니다. 그중 만들어 사용하는 몇 가지를 소개하겠습니다.

 

예전부터 내려오는 방법으로 parameter에 ... 을 두어 가변 인자를 전달받는 방법입니다.

가변 인자를 전달받기 위해서는 가장 중요한 Calling Convention이 __cdecl 이어야 한다는 점입니다.

 

 

Calling Convention이 궁금하신 분들은 아래 링크를 참조해주세요

https://wendys.tistory.com/22

 

__cdecl, __stdcall, __fastcall x86 호출 규약(Calling Convention)

Calling Convention X86에선 호출 규약이 __cdecl, __stacll, __fastcall 등으로 나누어있지만 x64에선 __fastcall 하나의 호출 규약만을 사용하도록 정의 되어있습니다. 오늘은 x86 호출 규약에 대해서만 정리를..

wendys.tistory.com

 

 

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으로 변환하고 싶은 경우 다음 포스팅을 참조하세요

https://wendys.tistory.com/84

 

[C/C++] convert std::string <-> std::wstring <-> utf-8

convert ansi string to unicode string and utf-8 string c/c++에서 ansi string과 unicode string, utf-8 string을 상호 변환하기 위해서는 간단한 대입으로는 불가능합니다. 예전에 소개해드렸던 std::string.a..

wendys.tistory.com

 

반응형

'⌨ 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

댓글

댓글을 사용할 수 없습니다.

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [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
다른 글 더 둘러보기

정보

웬디의 기묘한 이야기 블로그의 첫 페이지로 이동

웬디의 기묘한 이야기

  • 웬디의 기묘한 이야기의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록
  • 이야기

카테고리

  • 분류 전체보기 (204)
    • MY STORY (2)
    • 📸 WALKING WITH YOU (85)
      • 아이슬란드 신혼여행 이야기 (14)
      • 대한민국 구석구석 (62)
      • CONTAX N1 + T* 28-80mm (4)
      • SAMSUNG NX3000 (1)
      • 어느 멋진 날 (4)
    • ⌨ DEVELOPMENT (80)
      • BOOK:Review (1)
      • AI (13)
      • C++ (26)
      • Python (10)
      • WIndows Hooking (9)
      • Windows Kernel (3)
      • Design Pattern (3)
      • Debugging (9)
      • Tools (0)
      • Project (1)
      • Android (1)
      • 상업용 무료폰트 (4)
    • OS (4)
      • News (0)
      • Windows 일반 (4)
    • 모바일 (2)
      • 모바일 게임 (2)
    • 멘사 퍼즐 (9)
    • 생활 꿀 TIP (7)
      • 건강 (3)
      • 일상 (2)
    • 물생활 (8)
      • 골든볼 라미네지 롱핀 (8)
    • IT 기기 (2)
    • BLOG (4)
      • TISTORY BLOG TIP (3)

인기 글

공지사항

태그

  • 카페
  • c
  • 신혼여행
  • AI
  • 아이슬란드
  • windbg
  • 해외여행
  • c++

나의 외부 링크

  • kernel undocument api
  • 지구 관찰자의 일기
  • 지구와 지구곰

정보

WENDYS의 웬디의 기묘한 이야기

웬디의 기묘한 이야기

WENDYS

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © WENDYS. Designed by Fraccino.

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.