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.