int를 std :: string으로 변환


143

int를 문자열로 변환하는 가장 짧은 방법, 바람직하게 인라인 가능은 무엇입니까? stl 및 boost를 사용한 답변을 환영합니다.



63
C ++ 11에서는 다음 to_string과 같이 사용할 수 있습니다.std::string s = std::to_string(42)

5
긴 라이브 C ++ 11과 to_string! :)
augustin

답변:


351

C ++ 11에서 std :: to_string 을 사용할 수 있습니다

int i = 3;
std::string str = std::to_string(i);

4
누군가 관심이 있다면 std :: to_string ()은 MinGW에서 작동하지 않습니다.
Archie

3
@ bparker 맞아, 그것은 gcc 4.8.0에서 수정되었습니다. 최신 Code :: Blocks (13.12)와 함께 제공되는 MinGW에는 여전히 gcc 4.7.1이 있습니다.
Archie

47
#include <sstream>
#include <string>
const int i = 3;
std::ostringstream s;
s << i;
const std::string i_as_string(s.str());

36

boost::lexical_cast<std::string>(yourint) ...에서 boost/lexical_cast.hpp

std :: ostream을 지원하는 모든 작업에 적합하지만, 예를 들어 itoa

심지어 stringstream 또는 scanf보다 빠릅니다.


15
표준 C ++에서이 작업을 수행하는 간단한 방법이 없다면 부스트는 친구입니다. 물론 lexical_cast가져 오는 것과 같은 것이지만 부스트는 이런 종류의 작업에 너무 과도하다고 생각합니다 ...
rubenvb


부스트를 사용할 수없는 잠재 고객을 고려해야합니다.
Damian

5
"stl과 boost를 사용하는 답변을 환영합니다." -관객 고려
Conrad Jones

30

잘 알려진 방법은 스트림 연산자를 사용하는 것입니다.

#include <sstream>

std::ostringstream s;
int i;

s << i;

std::string converted(s.str());

물론 템플릿 기능을 사용하여 모든 유형에 대해 일반화 할 수 있습니다 ^^

#include <sstream>

template<typename T>
std::string toString(const T& value)
{
    std::ostringstream oss;
    oss << value;
    return oss.str();
}

1
참고 :이 필요합니다 #include <sstream>.
TechNyquist

@TechNyquist : 네 말이 맞아. 컴파일 가능한 것은 아니지만 변경되었습니다!
neuro

1
따라서 컴파일 가능하다는 의미는 아니었지만 실제로 포함하면 다음과 같습니다.)
TechNyquist

1
@TechNyquist : 예, 약간 std::;)
neuro

16

std::to_stringC ++ 11에서 사용할 수없는 경우 cppreference.com에 정의 된대로 작성할 수 있습니다.

std::string to_string( int value ) 부호있는 십진 정수를 std::sprintf(buf, "%d", value)충분히 큰 buf를 생성 할 내용과 동일한 내용의 문자열로 변환합니다 .

이행

#include <cstdio>
#include <string>
#include <cassert>

std::string to_string( int x ) {
  int length = snprintf( NULL, 0, "%d", x );
  assert( length >= 0 );
  char* buf = new char[length + 1];
  snprintf( buf, length + 1, "%d", x );
  std::string str( buf );
  delete[] buf;
  return str;
}

더 많은 것을 할 수 있습니다. 그냥 사용 "%g"변환 플로트 또는 문자열로 사용 두 배 "%x"에 너무 진수 표현으로 변환 INT에, 그리고.


14

비표준 기능이지만 가장 일반적인 컴파일러에서 구현됩니다.

int input = MY_VALUE;
char buffer[100] = {0};
int number_base = 10;
std::string output = itoa(input, buffer, number_base);

최신 정보

C ++ 11은 몇 가지 std::to_string오버로드를 도입했습니다 (기본은 10 진법입니다).


3
@DevSolar : 정교하게해야합니다. 부스트 예제가 이미 제공되었습니다. 이 솔루션은 boost가 설치되어 있지 않은 경우 대부분의 컴파일러에서 사용할 수 있습니다 (또는 요구 사항으로 인해 어떤 이유로 든 사용할 수 없음). ostream아니라 작품, 당신은 진수, 8 진수 또는 16 진수 형식이 아닌 다른 무언가로 숫자 문자열을 저장해야 할 때까지 (예를 들어 기본-32).
Zac Howland

3
비표준 기능이 좋아하는 때 나는 그것을 좋아하지 않아 itoa()stricmp()에 대한 응답으로 주어진 아무것도 .
DevSolar

6
당신의 감성을 불쾌하게해서 미안하지만, 첫 문장에서 비표준 기능이라고 진술했습니다. 필자는 언급하지 않았지만 sprintfOP의 목표를 달성 할 수도 있습니다 (공통 기본 번호 이외의 것이 필요한 경우 여전히 유연성 부족으로 어려움을 겪고 있습니다).
Zac Howland

1
예, 당신은 그것을 진술했으며, 그렇게 할 때조차도 답을 내리지 않았습니다. 그래서 우리는 짝수라고 생각합니다. ;-)
DevSolar

8

다음 매크로는 일회용 ostringstream또는 처럼 컴팩트하지 않습니다 boost::lexical_cast.

그러나 코드에서 반복적으로 문자열로 변환해야하는 경우이 매크로는 매번 문자열 스트림을 직접 처리하거나 명시 적 캐스팅보다 사용하기가 더 우아합니다.

또한 지원되는 모든 것을 조합 하여 변환하기 때문에 매우 다목적 입니다.operator<<()

정의:

#include <sstream>

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
            ( std::ostringstream() << std::dec << x ) ).str()

설명:

std::dec익명을 만들 수있는 부작용이없는 방법입니다 ostringstream일반에 ostream있도록 operator<<()기능 조회가 모든 종류의 올바르게 작동합니다. (첫 번째 인수가 포인터 유형이면 문제가 발생합니다.)

dynamic_cast에 형 다시 반환 ostringstream당신이 호출 할 수 있도록 str()그것을합니다.

사용하다:

#include <string>

int main()
{
    int i = 42;
    std::string s1 = SSTR( i );

    int x = 23;
    std::string s2 = SSTR( "i: " << i << ", x: " << x );
    return 0;
}

1
@rubenvb : 이것을 템플릿으로 바꾸는 방법을 알려 주시면이 구문을 사용한 C ++ 프로젝트를 모두 업데이트하겠습니다.
DevSolar

@rubenvb : 죄송합니다. 확실하지 않았습니다. 출력을 데이지 체인으로 묶을 수있는 능력을 잃지 않거나 (두 번째 예에서와 같이) 복잡한 처리 엉망으로 처리하지 않고 템플릿으로 변환하는 방법을 보지 못했습니다 (C ++ 98 사용) 여러 매개 변수 및 매개 변수 유형
DevSolar

@DevSolar : inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }하지 않습니까? (테스트를 거치지 않았지만 무엇이 잘못 될지 궁금합니다.
rubenvb

@rubenvb : 개인을 위해 할 것입니다 int(첫 번째 예). 그러나 않고 ostream있는 컴파일러 볼 main(이 템플릿 함수 내에서 숨겨져로), 그것을 찾기 위해 노력할 것입니다 operator<<()에 대한 const char []내 두 번째 예에 - 까악 까악 것이다. OP가에 대한 요청 만 알고 int있지만 이보다 일반적인 매크로는 매우 유용하며 실제로 여기에 포함시킬 것이라고 생각했습니다.
DevSolar

다양성을 위해 템플릿 기능을 선호합니다. 데이지 체인의 경우 아마도 RTTI 비트와 같은 기능으로 처리 될 수 있습니다.
neuro

2

이 기능을 사용 int하여 std::string다음을 포함시킨 후 변환 할 수 있습니다 <sstream>.

#include <sstream>

string IntToString (int a)
{
    stringstream temp;
    temp<<a;
    return temp.str();
}


-2
#include <string>
#include <stdlib.h>

여기에 int를 문자열로 변환하는 또 다른 쉬운 방법이 있습니다.

int n = random(65,90);
std::string str1=(__String::createWithFormat("%c",n)->getCString());

더 많은 방법을 보려면이 링크를 방문하십시오 https://www.geeksforgeeks.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-string/


이 methodheader 파일 사용법 #include <문자열>를 사용하려면 다음을 포함해야한다 사용법 #include <stdlib.h>
또는 Vipul Dungranee

-3

내가 가지고 있다고 가정 해보십시오 integer = 0123456789101112. 이제이 정수는 stringstream클래스에 의해 문자열로 변환 될 수 있습니다 .

다음은 C ++ 코드입니다.

   #include <bits/stdc++.h>
   using namespace std;
   int main()
   {
      int n,i;
      string s;
      stringstream st;
      for(i=0;i<=12;i++)
      {
        st<<i;
      }
      s=st.str();
      cout<<s<<endl;
      return 0;

    }

몇 년 전에 이미 유사하지는 않았지만 더 완전한 답변이 있습니까?
Walter

예, 그러나이 답변은 완벽합니다. 이전에서 효과적인 답변을 얻지 못했기 때문에 생각합니다.
Shawon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.