1 분 소요

😢상황

  • C++ 코드에서 숫자, 문자열, 변수를 조합하여 포맷팅된 문자열을 만들고 싶음
  • C언어 스타일 sprintf, 현대 C++ std::format, 스트림 기반 ostringstream 등 다양한 방법이 있어 헷갈림

🛠️해결법

방법 1: std::format (C++20 표준)

#include <format>
#include <string>

std::string result = std::format("이름: {}, 나이: {}", "홍길동", 30);

💡 가독성이 매우 좋고, 타입 안전성이 뛰어남
💡 Visual Studio 2022, gcc 13 이상 등에서 지원


방법 2: std::ostringstream

#include <sstream>
#include <string>

std::ostringstream oss;
oss << "이름: " << "홍길동" << ", 나이: " << 30;
std::string result = oss.str();

🔹 스트림 조합 방식, 다양한 타입을 « 연산자로 연결 가능


방법 3: sprintf (C 스타일)

#include <cstdio>

char buffer[100];
sprintf(buffer, "이름: %s, 나이: %d", "홍길동", 30);
std::string result = buffer;

🔸 간단하지만, 버퍼 오버플로우 위험이 있으므로 신중하게 사용해야 함
🔸 가능하면 snprintf처럼 안전한 버전 사용 권장


보너스: fmt 라이브러리 사용

#include <fmt/core.h>

std::string result = fmt::format("이름: {}, 나이: {}", "홍길동", 30);

💡 std::format과 거의 동일한 문법을 제공하며, C++20 이전 버전에서도 사용 가능
💡 빠르고 강력한 포맷팅 라이브러리 (fmtlib)


정리: 왜 이게 효과 있었는가?

  • 현대 C++에서는 std::format 사용을 가장 권장
  • 구버전 C++에서는 ostringstream 또는 fmt 라이브러리가 안전하고 편리함
  • sprintf는 여전히 빠르지만 메모리 안전성 문제가 있을 수 있음

👉 프로젝트 환경(C++ 버전)에 따라 적절한 문자열 포맷팅 방법을 선택하는 것이 중요합니다!