C ++에서 int를 문자열로 변환하는 가장 쉬운 방법


1574

C ++에서 int동등한 것으로 변환하는 가장 쉬운 방법은 무엇입니까? string두 가지 방법을 알고 있습니다. 더 쉬운 방법이 있습니까?

(1)

int a = 10;
char *intStr = itoa(a);
string str = string(intStr);

(2)

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();

4
당신이 준 두 가지 방법 모두 좋은 해결책이라고 생각합니다. 필요한 상황에 따라 다릅니다. 이미 파일 읽기 또는 쓰기와 같은 스트림 작업을하고 있다면 두 번째 방법이 가장 좋습니다. int를 문자열로 함수 인수에 전달해야한다면 itoa가 쉬운 방법 일 수 있습니다. 그러나 대부분의 경우 파일을 처리 할 때 int에서 문자열로의 변환이 발생하므로 스트림이 적합합니다.
Charles Brunet

41
옵션 1은 어떻게 작동합니까? itoa()세 가지 매개 변수 를 취하는 것이 내 이해입니다 .
b1nary.atr0phy

1
itoa는 해당 스트림보다 빠릅니다. itoa 방법으로 문자열 버퍼를 재사용하는 방법도 있습니다 (예를 들어, 문자열을 자주 생성하는 경우 힙 할당을 피하는 것 (예 : 빠르게 업데이트되는 숫자 출력)). 또는 할당 오버 헤드 등을 줄이기 위해 사용자 정의 streambuf를 생성 할 수 있습니다. 처음에 스트림을 구성하는 것도 저렴한 비용이 아닙니다.
Pete

6
@Pete : 어느 것이 더 빠른지에 대해 걱정하기 시작하면 stackoverflow.com/questions/4351371/…
Ben Voigt

20
itoa ()는 표준의 일부가 아니므로 모든 컴파일러에서 지원하지는 않으므로 코드를 이식성이 없게 만듭니다. Linux의 경우이 기능을 지원하지 않는 GCC 이외의 것을 사용하지 않는 한 가장 확실합니다. C ++ 0x가 있다면 @Matthieu가 그의 대답에서 제안한 것과 함께하십시오. 그렇지 않은 경우 잘 지원되는 기능이므로 코드가 모든 C ++ 컴파일러와 호환되어야하므로 stringstream으로 이동하십시오. 대안으로 항상 sprintf ()를 사용할 수 있습니다.
rbaleksandar

답변:


2099

C ++ 11 컨덕터 std::stoi(각 숫자 타입의 변형)과 std::to_string, 상기 C의 상대 atoiitoa의 용어로 표현하지만 std::string.

#include <string> 

std::string s = std::to_string(42);

그러므로 제가 생각할 수있는 가장 짧은 방법입니다. auto키워드를 사용하여 유형 이름을 생략 할 수도 있습니다 .

auto s = std::to_string(42);

주 : [string.conversions]을 ( 21.5 에서 n3242 )


199
to_stringstd수정 의 구성원이 아님 : stackoverflow.com/questions/12975341/…
Ben

36
: 또는 컴파일러에 따라 딱 맞는 언어 표준 설정g++ -std=c++11 someFile.cc
토마스 M. DuBuisson

12
@Steve : 있어야합니다. std내가 아는 모든 컴파일러에서 하나를 제외하고 멤버입니다 .
Mooing Duck

5
@Matthiew M. 나는 당신이 제안하는 동일한을 사용하고하지만 난이 오류가 무엇입니까 : Error : No instance of overloaded function "std::to_string" matches the argument list 내가 VS2010 C ++ 사용하고

19
@Flying : VS2010에서는 변환 정수를 다음 유형 중 하나로 명시 적으로 캐스팅해야합니다. [_Longlong, _ULonglong, long double]; string s = to_string((_ULonglong)i);
Zac

184

몇 년 후 @ v.oddou과 토론을 시작한 C ++ 17은 마침내 매크로 추악함을 거치지 않고 원래 매크로 기반 유형에 관계 없이 솔루션을 수행 할 수있는 방법을 제공했습니다 .

// variadic template
template < typename... Args >
std::string sstr( Args &&... args )
{
    std::ostringstream sstr;
    // fold expression
    ( sstr << std::dec << ... << args );
    return sstr.str();
}

용법:

int i = 42;
std::string s = sstr( "i is: ", i );
puts( sstr( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( sstr( "Foo is '", x, "', i is ", i ) );

원래 답변 :

"문자열로 변환"은 반복되는 문제이므로 항상 C ++ 소스의 중앙 헤더에 SSTR () 매크로를 정의 합니다.

#include <sstream>

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

사용법은 다음과 같이 쉽습니다.

int i = 42;
std::string s = SSTR( "i is: " << i );
puts( SSTR( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( SSTR( "Foo is '" << x << "', i is " << i ) );

위의 내용은 C ++ 98과 호환되며 (C ++ 11을 사용할 수없는 경우 std::to_string) 타사 포함이 필요하지 않습니다 (Boost를 사용할 수없는 경우 lexical_cast<>). 이 두 가지 솔루션 모두 더 나은 성능을 제공합니다.


2
나는 익숙하지 dynamic_cast않지만 컴파일에 clang을 사용하여 그것에 대해 불평합니다. 방금 생략하면 dynamic_cast제대로 컴파일됩니다. dynamic_cast이 경우 봉사의 목적은 무엇 입니까? 우리는 이미을 만들고 있는데 ostringstream왜 캐스트합니까?
Mathew

2
@Mathew : 내 대답의 링크는 구문의 각 부분에 대한 자세한 설명으로 이어집니다. 우리가하는 동안 생성ostringstream, 우리가 호출 operator<<()하는 반환, 거기에 ostream &있는 - .str()정의되어 있지 않습니다. clang이 캐스트없이 어떻게 작동하는지 궁금합니다 (또는 왜 오류가 발생하는지). 이 구조는 여러 곳에 게시되어 있으며, MSVC, GCC 및 XLC를 포함한 많은 다른 컴파일러에서 10 년 이상 사용해 왔으므로 clang balks에 놀랐습니다.
DevSolar

5
호기심을 불러 일으키기 위해 파티에 왔습니다. 이유 : 우아하지 않고 느릴 수있는 솔루션에 대해 너무 많은 표를 얻습니다. 1. 매크로 사용법. 나는 매크로에 체계적으로 찌르지 않지만, 이것은 너무 짧으며 최종 클라이언트는 항상 보호되지 않은 여러 줄 매크로에 대한 두려움 외에도 논쟁의 반복을 두려워합니다. (do {} while (0)에 의해 보호되지 않음) 2. dynamic_cast. 라이브러리가 실제로 원하는대로 구현되고 있다고 주장하지 않는 한 여기에 static_cast 만 있으면됩니다. 이 경우 대신 boost :: polymorphic_downcast를 사용해야합니다.
v.oddou

2
@ v.oddou : 물론 당신은 비판을받을 수 있습니다. 그러나 1. 유효하지 않습니다. 매크로는 단일 문장이므로 do { } while( 0 )아무 것도 추가하지 않습니다. 2와 3을 사용하면 아마 요점을 알 수 있습니다. 이것은 정적 캐스트로 수행 될 수 있으며 템플릿 마법사 중 하나가 "더 나은"인터페이스를 만들 수 있습니다. 그러나 내가 말했듯이, 이것은 결코 나 자신의 발명품이 아닙니다. 이 매크로 (매크로!)는 어디에나 있습니다. POLA 자체의 경우입니다. 좀 더 "합리화"하기 위해이 부분을 가지고 장난감을 만들 수도 있습니다.
DevSolar

1
@ v.oddou : C ++ 17이 우리에게 가져온 것들 중에서 내가 찾은 것을보십시오. :-) 업데이트 된 답변이 마음에 드시기 바랍니다.
DevSolar

109

나는 보통 다음 방법을 사용합니다.

#include <sstream>

template <typename T>
  std::string NumberToString ( T Number )
  {
     std::ostringstream ss;
     ss << Number;
     return ss.str();
  }

여기 에 자세히 설명되어 있습니다 .


2
를 사용하기 전에 ss필요 ss.clear()합니다. 이 초기화없이 예기치 않은 결과가 나타났습니다.
lifebalance

14
@ lifebalance : 그런 행동을 본 적이 없습니다.
Rasoul

18
@lifebalance : clear()새로 만든 ostringstream객체 가 필요하지 않습니다 . clear()오류 / eof 플래그를 재설정하고 아직 오류 / eof 조건이 생성되지 않았습니다.
Remy Lebeau

2
@Rasoul NumberToString(23213.123)은 생산 23213.1하는 동안 std::to_string(23213.123)생산합니다. 23213.123000어떻게됩니까?
Killzone Kid

1
@KillzoneKid 이것은 std ostream이 상태 저장이기 때문에 (이것은 10 진수의 수와 같이 이전 상태 변경이 유지됨을 의미 함)이 방법이 기본 상태로 시작하기 때문입니다.
xryl669

85

아마도 가장 일반적인 쉬운 방법은 기본적으로 두 번째 선택을 Boostlexical_cast 와 같은 이라는 이름의 템플릿으로 래핑 하므로 코드는 다음과 같습니다.

int a = 10;
string s = lexical_cast<string>(a);

이것의 좋은 점은 다른 캐스트도 지원한다는 것입니다 (예를 들어 반대 방향으로도 잘 작동합니다).

Boost lexical_cast가 stringstream에 쓰고 스트림에서 다시 추출하는 것으로 시작했지만 이제는 몇 가지 추가 사항이 있습니다. 우선, 몇 가지 유형에 대한 전문화가 추가되었으므로 많은 일반 유형의 경우 문자열 스트림을 사용하는 것보다 훨씬 빠릅니다. 둘째, 이제 결과를 확인하므로 (예를 들어) 문자열에서를로 변환하면 문자열에 변환 int할 수없는 것이 포함되어 있으면 예외가 발생할 수 있습니다 int(예 : 1234성공하지만 123abc던질 것입니다) .

C ++ 11부터 std::to_string정수 유형에 과부하 된 함수가 있으므로 다음과 같은 코드를 사용할 수 있습니다.

int a = 20;
std::string s = std::to_string(a);
// or: auto s = std::to_string(a);

로 변환하고 등가 인 것으로 정의 이러한 표준 sprintf(예컨대 오브젝트의 지정된 타입 일치 변환 지정하여 %d대를 int후 만들기에 충분한 크기의 버퍼에) std::string그 버퍼의 내용을.


2
나는 그가 포함과 네임 스페이스를 보여 주지만 Kevin의 대답을 선호합니다. 사소한 그립. :) 그래도 잘 했어!
Jason R. Mick

4
C ++ 11을 지원하지 않으면 이것이 갈 길이라고 말하고 싶습니다.
Alex

40

Boost가 설치되어있는 경우 (필요한 경우) :

#include <boost/lexical_cast.hpp>

int num = 4;
std::string str = boost::lexical_cast<std::string>(num);

4
부스트 설치에 동의했습니다. 나는 종종 하나 이상의 문자열을 포맷 할 것이라고 생각합니다. 이 목적을 위해 내가 부스트 : : 형식 예를 들어, 형식 ( "% 02D", 수) .str () 선호
베르너 에라스무스

28

문자열 스트림을 사용하는 것이 더 쉬울 것입니다.

#include <sstream>

int x = 42;          // The integer
string str;          // The string
ostringstream temp;  // 'temp' as in temporary
temp << x;
str = temp.str();    // str is 'temp' as string

또는 기능을 수행하십시오.

#include <sstream>

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

18

순수한 C ++에서 내가 아는 것은 아닙니다. 그러나 당신이 언급 한 것의 약간의 수정

string s = string(itoa(a));

작동해야하고 꽤 짧습니다.


55
itoa()표준 기능이 아닙니다!
만화가

4
@ 만화가 : 그럼 뭐야?
user541686

20
이 함수는 ANSI-C 및 C ++에서 정의되지 않았습니다. 따라서 g ++와 같은 일부 컴파일러에서는 지원되지 않습니다.
cartoonist

17

Matthieu M이 제안한std::to_string 대로 C ++ 11에서 사용할 수 있습니다 .

std::to_string(42);

성능이 중요한 경우 (전환 수를 많이 할 경우) 또는, 당신은 사용할 수 있습니다 fmt::format_int으로부터 {FMT} 의 정수를 변환하는 라이브러리 std::string:

fmt::format_int(42).str();

또는 C 문자열 :

fmt::format_int f(42);
f.c_str();

후자는 동적 메모리 할당을 수행하지 않으며 std::to_stringBoost Karma 벤치 마크 보다 10 배 이상 빠릅니다 . 자세한 내용 은 C ++에서 빠른 정수에서 문자열로 변환 을 참조하십시오.

둘 다 스레드로부터 안전합니다.

달리 std::to_string, fmt::format_intC ++ (11) 및 C ++ 컴파일러 작업을 필요로하지 않습니다.

면책 조항 : 저는 {fmt} 라이브러리의 저자입니다.


2
스레드 안전 (재진입)을 유지하면서 동적 메모리 할당이 없다는 주장이 궁금해서 코드를 읽습니다 c_str(). fmt::FormatInt클래스 내부에 선언 된 버퍼에 대한 포인터를 반환합니다. 세미콜론 - 볼도 stackoverflow.com/questions/4214153/lifetime-of-temporaries
소렌

1
예,와 동일한 동작 std::string::c_str()(따라서 이름 지정) 전체 표현식 외부에서 사용하려는 경우 객체를 생성하면 객체가 손상 될 위험없이 FormatInt f(42);사용할 수 있습니다 f.c_str().
vitaut 2016 년

1
std :: to_string (num)을 사용하여 int에서 string으로 변환하려고하면 이상한 일이 발생합니다. 결과를 변수에 저장하고 n이 증가함에 따라 stringNum [1] 또는 stringNum [n]과 같이 액세스하려고하면 가비지가 발생합니다.
user8951490

1
그것은이 질문에 대한 정답입니다. 상태가 아닌 효율적이고 표준적인 코드입니다.
xryl669

16

sprintf()형식 변환에 매우 좋습니다. 그런 다음 1에서와 같이 결과 C 문자열을 C ++ 문자열에 할당 할 수 있습니다.


1
네 그러나 나는 일반적으로 C 문자열을 처리 할 때 snprintf () 및 친구에게 결과에 의존합니다.
Throwback1986

1
@MatthieuM. 당신의 의견은 당신이 아니라는 것을 더 증명합니다. 이 한계로 인해 출력이 잘린 경우 리턴 값은 충분한 공간이 사용 가능한 경우 최종 문자열에 기록 된 문자 수 (종료 널 바이트 제외)입니다. 따라서 크기 이상의 반환 값은 출력이 잘린 것을 의미합니다. 따라서 NULL필요한 버퍼 크기를 얻으려면 크기를 0으로 지정하십시오.
user1095108

2
@ user1095108 : 당신이 착각하고 있다고 생각합니다 snprintf( SNP 접두사 sprintf참고 ). ( SP 접두사 참고 ). 크기를 전자에 전달하면 오버플로되지 않도록주의하지만 후자는 버퍼의 크기를 모르므로 오버플로 될 수 있습니다.
Matthieu M.

1
아이디어는 snprintf변형을 먼저 호출하고 sprintf그 후에 변형 을 호출하는 것입니다. 버퍼 크기가 알려 sprintf지면 호출 이 완전히 안전 해집니다.
user1095108

1
아, 네. snprintf에 대한 첫 번째 버퍼 가 충분하지 않으면 리턴 값이 충분한 지 알려줍니다. sprintf와 snprintf의 구현에 의존하여 불필요하게 위험하기 때문에 여전히 두 번째 호출에 snprintf를 사용합니다.
mabraham

11

먼저 다음을 포함하십시오 :

#include <string>
#include <sstream>

두 번째로 메소드를 추가하십시오.

template <typename T>
string NumberToString(T pNumber)
{
 ostringstream oOStrStream;
 oOStrStream << pNumber;
 return oOStrStream.str();
}

다음과 같은 방법을 사용하십시오.

NumberToString(69);

또는

int x = 69;
string vStr = NumberToString(x) + " Hello word!."

10

숫자 변환에 stringstream을 사용하는 것은 위험합니다!

형식화 된 출력 을 삽입 하도록 알려주는 http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/를 참조 하십시오operator<< .

현재 로케일에 따라 3 자리보다 큰 정수는 4 자리 문자열로 변환되어 수천 구분 기호를 추가 할 수 있습니다.

int = 1000를 들어 문자열로 변환 할 수 있습니다 1.001. 이로 인해 비교 작업이 전혀 작동하지 않을 수 있습니다.

그래서 나는 그 std::to_string길을 사용하는 것이 좋습니다 . 더 쉽고 당신이 기대하는 것을합니다.

업데이트 됨 (아래 의견 참조) :

C ++ 17은 std::to_chars고성능 로케일 독립적 대안으로 제공


2
데이터를 교환해야하는 경우 이것이 심각한 문제라는 데 동의합니다. 불행히도 std::to_string현재 로케일 도 사용합니다 ( 'Notes'섹션의 en.cppreference.com/w/cpp/string/basic_string/to_string 참조 ). (stringstream을에서 거의 모든 표준 도구 sprintf뿐만 아니라, sscanf등) 현재의 로케일을 사용하고 있습니다. 나는 그것이 나를 때리기 때까지 최근까지 이것을 알지 못했습니다. 현재 집에서 만든 물건을 사용하고 있지만 어렵지 않습니다.
Bert Bril

위의 링크에서 C ++ 17은 std :: to_chars를 고성능 로케일 독립적 대안으로 제공한다고 명시되어 있습니다.
YesThatIsMyName

불행히도, 나는 내년 C ++ 11에 갇혀 있습니다 (행운 적으로 개선되었습니다).
버트 브릴

1
from_chars와 to_chars는 완벽하지만 불행히도 wchar_t 변형을 제공하지 않았습니다.
gast128

8

C ++ 98 의 경우 몇 가지 옵션이 있습니다.

boost/lexical_cast

Boost는 C ++ 라이브러리의 일부가 아니지만 유용한 라이브러리 확장이 많이 포함되어 있습니다.

lexical_cast기능 템플릿에 그들이 텍스트로 표시되는 임의의 유형에서 일반적인 변환을 지원하기위한 편리하고 일관성있는 양식을 제공합니다.
- 부스트의 문서

#include "boost/lexical_cast.hpp"
#include <string>

int main() {
    int x = 5;
    std::string x_str = boost::lexical_cast<std::string>(x);
    return 0;
}

런타임의 경우 lexical_cast작업은 첫 번째 변환에서 약 80 마이크로 초 (내 컴퓨터에서)가 소요되며, 이후에 중복으로 수행하면 속도가 상당히 빨라집니다.


itoa

이 함수는 ANSI-C에 정의되어 있지 않으며 C ++의 일부가 아니지만 일부 컴파일러에서 지원합니다.
- cplusplus.com

이는 gcc/ g++를 사용하여 코드를 컴파일 할 수 없음을 의미합니다 itoa.

#include <stdlib.h>

int main() {
    int x = 5;
    char * x_str = new char[2];
    x_str = itoa(x, x_str, 10); // base 10
    return 0;
}

보고 할 런타임이 없습니다. 나는 인 비주얼 스튜디오가 설치되지 않은 소문에 컴파일 할 수 itoa.


sprintf

sprintf C 문자열에서 작동하는 C 표준 라이브러리 함수이며 완벽하게 유효한 대안입니다.

printf에 format이 사용 된 경우 인쇄 될 텍스트와 동일한 텍스트로 문자열을 작성하지만 인쇄되는 대신 내용은 str이 가리키는 버퍼에 C 문자열로 저장됩니다.
- cplusplus.com

#include <stdio.h>

int main() {
    int x = 5;
    char * x_str = new char[2];
    int chars_written = sprintf(x_str, "%d", x);
    return 0;
}

stdio.h헤더는 필요하지 않을 수도있다. 런타임과 관련하여 sprintf첫 번째 변환 에서 작업은 약 40 마이크로 초 (내 컴퓨터에서)가 소요되며, 이후에 중복으로 수행하면 속도가 상당히 빨라집니다.


stringstream

이것은 정수를 문자열로 변환하는 C ++ 라이브러리의 주요 방법이며 그 반대의 경우도 마찬가지입니다. stringstream스트림의 의도 된 사용을 추가로 제한하는 유사한 자매 기능이 있습니다 ( 예 :) ostringstream. ostringstream구체적으로 사용하면 코드를 읽는 사람에게 <<본질적으로 연산자 만 사용 하겠다고 알려줍니다 . 이 함수는 정수를 문자열로 변환하는 데 특히 필요한 모든 것입니다. 보다 자세한 토론 은 이 질문 을 참조하십시오 .

#include <sstream>
#include <string>

int main() {
    int x = 5;
    std::ostringstream stream;
    stream << x;
    std::string x_str = stream.str();
    return 0;
}

런타임과 관련하여 ostringstream작업은 약 71 마이크로 초 (내 컴퓨터에서)가 소요 되며, 이전에 수행 한 기능만큼 많이 수행 되지는 않지만 중복으로 수행 된 후에는 상당히 속도가 빨라집니다 .


물론 다른 옵션이 있으며이 중 하나를 자신의 기능으로 래핑 할 수도 있지만이 방법은 인기있는 옵션 중 일부를 분석적으로 보여줍니다.


우리
A. B

@AB 여전히 C ++ 98 사용자가 남아 있다고 믿을 수 없습니다.
Kotauskas

@VladislavToncharov 업무가 레거시 장비 및 코드 만 지원하는 경우, 더 새로운 산업 표준을 사용하여 오래된 것을 사용합니다. 여름 전에 파이썬 2.3으로 코드를 작성했습니다.
Joshua Detwiler

@JoshuaDetwiler 오, 잊어 버렸습니다. 죄송합니다.
Kotauskas '

4

C ++ 17은 std :: to_chars 를 고성능 로케일 독립적 대안으로 제공합니다.


3

스트림과 같은 방식으로 현을 작곡 할 수있는 구문 설탕을 추가하는 것이 다소 쉽습니다.

#include <string>
#include <sstream>

struct strmake {
    std::stringstream s;
    template <typename T> strmake& operator << (const T& x) {
        s << x; return *this;
    }   
    operator std::string() {return s.str();}
};

이제 원하는 것을 (연산자 << (std::ostream& ..)가 정의 된 경우) 추가 strmake()하고 std::string. 대신 사용할 수 있습니다.

예:

#include <iostream>

int main() {
    std::string x =
      strmake() << "Current time is " << 5+5 << ":" << 5*5 << " GST";
    std::cout << x << std::endl;
}

2

편집. 고정 자릿수 를 가진 정수를 '0'으로 왼쪽으로 채워진 char *로 빠르게 변환 해야하는 경우 리틀 엔디안 아키텍처 (모든 x86, x86_64 및 기타)의 예입니다.

두 자리 숫자를 변환하는 경우 :

int32_t s = 0x3030 | (n/10) | (n%10) << 8;

세 자리 숫자를 변환하는 경우 :

int32_t s = 0x303030 | (n/100) | (n/10%10) << 8 | (n%10) << 16;

네 자리 숫자를 변환하는 경우 :

int64_t s = 0x30303030 | (n/1000) | (n/100%10)<<8 | (n/10%10)<<16 | (n%10)<<24;

그리고 최대 7 자리 숫자입니다. 이 예에서는 n주어진 정수입니다. 변환 후 문자열 표현은 다음과 같이 액세스 할 수 있습니다 (char*)&s.

std::cout << (char*)&s << std::endl;

참고 : 빅 엔디안 바이트 순서로 필요하다면 테스트하지는 않았지만 여기에 예가 있습니다 .3 자리 숫자의 경우 int32_t s = 0x00303030 | (n/100)<< 24 | (n/10%10)<<16 | (n%10)<<8;4 자리 숫자 (64 비트 아치)입니다. int64_t s = 0x0000000030303030 | (n/1000)<<56 | (n/100%10)<<48 | (n/10%10)<<40 | (n%10)<<32;작동해야한다고 생각합니다.


2
바이트 순서는 어떻습니까?
shjeff

포인터 앨리어싱으로 인해 정의되지 않은 동작이 아닙니까?
디그 너프

1
@shjeff 의견에 감사드립니다. 엔디안에 대한 메모를 답변에 추가했습니다.
Alek

@dgnuff 이것을 지적 해 주셔서 감사합니다.이 문제는 없지만 당신이 옳습니다. 엄격한 별칭 규칙을 준수하도록 답변을 약간 수정했습니다. 감사합니다.
Alek

1

사용하다:

#define convertToString(x) #x

int main()
{
    convertToString(42); // Returns const char* equivalent of 42
}

3
리터럴 숫자로만 작동하며 변수 내용을 평가하지는 않지만 때로는 유용합니다.
Wolf

권리. 그러나 시간에 확실히 편리
maverick9888

1
만 리터럴 상수 번호와 컴파일시에 작동, 나는 영업 이익은 변수의 정수를 사용하여 동적 변환을 요구 생각
잉을. Gerardo Sánchez 1

0

나는 사용한다:

int myint = 0;
long double myLD = 0.0;

string myint_str = static_cast<ostringstream*>(&(ostringstream() << myint))->str();
string myLD_str = static_cast<ostringstream*>(&(ostringstream() << myLD))->str();

내 Windows 및 Linux g ++ 컴파일러에서 작동합니다.


0

또 다른 쉬운 방법이 있습니다.

char str[100];
sprintf(str, "%d", 101);
string s = str;

sprintf 필요한 형식의 문자열에 데이터를 삽입하는 것으로 잘 알려진 것입니다.

char *세 번째 줄에 표시된 것처럼 배열을 문자열로 변환 할 수 있습니다 .


0

이것은 나를 위해 일했다-

내 코드 :

#include <iostream>
using namespace std;

int main()
{
    int n = 32;
    string s = to_string(n);
    cout << "string: " + s  << endl;
    return 0;
}

본질적으로 무엇을 사용합니까? stringstream?
Peter Mortensen 19 년

@PeterMortensen주의 깊게보세요std::to_string()
Kotauskas

나는 using namespace std;:)
Gonçalo Garrido

0

std::to_string()숫자 유형에 도입 된 C ++ 11 :

int n = 123; // Input, signed/unsigned short/int/long/long long/float/double
std::string str = std::to_string(n); // Output, std::string

4
안녕! 이것이 왜 그리고 어떻게 질문에 대한 답을 제공하는지에 대한 설명을 추가 할 수 있습니까?
anothernode

0

사용하다:

#include<iostream>
#include<string>

std::string intToString(int num);

int main()
{
    int integer = 4782151;

    std::string integerAsStr = intToString(integer);

    std::cout << "integer = " << integer << std::endl;
    std::cout << "integerAsStr = " << integerAsStr << std::endl;

    return 0;
}

std::string intToString(int num)
{
    std::string numAsStr;

    while (num)
    {
        char toInsert = (num % 10) + 48;
        numAsStr.insert(0, 1, toInsert);

        num /= 10;
    }
    return numAsStr;
}

1
완전히 n≤0 실패
토비 Speight

-1
string number_to_string(int x) {

    if (!x)
        return "0";

    string s, s2;
    while(x) {
        s.push_back(x%10 + '0');
        x /= 10;
    }
    reverse(s.begin(), s.end());
    return s;
}

1
이 코드 스 니펫에 대해 약간의 단기적인 도움을 제공 할 수 있습니다. 적절한 설명 이것이 문제에 대한 좋은 해결책 인지 보여줌으로써 장기적인 가치를 크게 향상시킬 것이며, 다른 비슷한 질문을 가진 미래 독자들에게 더 유용 할 것입니다. 제발 편집 당신이 만든 가정 등 일부 설명을 추가 할 답변을.
Toby Speight

완전히 n≤0 실패
토비 Speight

의견을 추가 하고 답변을 설명하고 답변 방법을 읽으십시오 .
Aksen P

-1

MFC를 사용하는 경우 다음을 사용할 수 있습니다 CString.

int a = 10;
CString strA;
strA.Format("%d", a);

8
이것은 Microsoft 전용 확장명입니다. msdn.microsoft.com/en-us/library/ms174288.aspx
JonnyJD

1
CString :: Format ()의 아이디어를 좋아합니다. 불행히도 그것은 휴대용이 아닌 MS에서만 가능합니다.
Nick

1
5 년 후에도 계속 의견을 밝히기 때문에 귀하의 의견 @JonnyJD의 정보를 포함하도록 답변을 업데이트했습니다.
Tur1ng

-2
char * bufSecs = new char[32];
char * bufMs = new char[32];
sprintf(bufSecs, "%d", timeStart.elapsed()/1000);
sprintf(bufMs, "%d", timeStart.elapsed()%1000);

12
메모리 누수, 나로부터 -1
paulm

버퍼 오버런 냄새가납니다.
Kotauskas

-2
namespace std
{
    inline string to_string(int _Val)
    {   // Convert long long to string
        char _Buf[2 * _MAX_INT_DIG];
        snprintf(_Buf, "%d", _Val);
        return (string(_Buf));
    }
}

이제 사용할 수 있습니다 to_string(5).


10
이 솔루션은 작동하지만 사용하지 않는 것이 좋습니다! 밑줄과 대문자로 시작하는 이름은 컴파일러 용으로 예약되어 있으므로 절대 사용해서는 안됩니다. std네임 스페이스에 함수를 삽입하는 것도 수행해야 할 작업이 아닙니다. 또한 _MAX_INT_DIG표준 매크로 처럼 보이지 않으므로 잘못 정의 된 경우이 코드는 정의되지 않은 동작을 유발할 수 있습니다. -1
iFreilicht

6
_MAX_INT_DIG 란 무엇이며 왜 두 배입니까?
paulm

-2

나는 사용 stringstream이 매우 쉽다고 생각합니다 .

 string toString(int n)
 {
     stringstream ss(n);
     ss << n;
     return ss.str();
 }

 int main()
 {
    int n;
    cin >> n;
    cout << toString(n) << endl;
    return 0;
 }

이것은 질문에서 언급되었으며 불행히도 상당히 느립니다.
Kotauskas

-3

카운터 유형의 알고리즘을 사용하여 문자열로 변환합니다. Commodore 64 컴퓨터 를 프로그래밍하여이 기술을 얻었습니다 . 게임 프로그래밍에도 좋습니다.

  • 정수를 취하고 10의 거듭 제곱으로 가중치가 부여되는 각 숫자를 취하십시오. 따라서 정수가 950이라고 가정하십시오.

    • 정수가 100,000보다 크거나 같으면 100,000을 빼고 [ "000000"]에서 문자열의 카운터를 늘리십시오.
      10 만 자리에 더 이상 숫자가 없을 때까지 계속하십시오. 10의 다른 힘을 버리십시오.

    • 정수가 10,000 이상인 경우 10,000을 빼고 문자열에서 [ "000000"] + 1 위치에서 카운터를 늘리십시오.
      10,000 자리에 더 이상 숫자가 없을 때까지 계속하십시오.

  • 10의 다른 힘을 버리십시오

  • 패턴 반복

예를 들어 950이 너무 작아서 아이디어를 얻길 바랍니다.


코드에 예제를 표시하는 것보다는 알고리즘을 설명하는 것이별로 도움이되지 않습니다.
cdeerinck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.