etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 12. 31. 03:33
반응형

질문자 :Nemo


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();


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] 참조( n3242의 21.5 )


Matthieu M.

C++20 업데이트: std::format 은 이제 관용적인 방법이 될 것입니다.


C++17 업데이트:

몇 년 후 @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++98) 답변:

"...를 문자열로 변환"하는 것은 반복되는 문제이므로 저는 항상 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<> 사용할 수 없는 경우). 이러한 다른 솔루션은 모두 더 나은 성능을 제공합니다.


DevSolar

나는 일반적으로 다음 방법을 사용합니다.

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

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


Rasoul

현재 C++

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 의 해당 버퍼의 내용입니다.

오래된 C++

이전(C++11 이전) 컴파일러의 경우 아마도 가장 일반적인 쉬운 방법은 기본적으로 두 번째 선택을 Boost 에 있는 것과 같은 lexical_cast 라는 템플릿으로 래핑하므로 코드는 다음과 같습니다.

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

이것의 한 가지 좋은 점은 다른 캐스트도 지원한다는 것입니다(예: 반대 방향에서도 잘 작동함).

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


Jerry Coffin

Boost가 설치되어 있는 경우(설치해야 함):

 #include <boost/lexical_cast.hpp> int num = 4; std::string str = boost::lexical_cast<std::string>(num);

Kevin

stringstreams를 사용하는 것이 더 쉬울 것입니다:

 #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(); }

user2287915

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

 string s = string(itoa(a));

작동해야 하며 매우 짧습니다.


user541686

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

 std::to_string(42);

또는 성능이 중요한 경우(예: 많은 변환을 수행하는 경우) {fmt} 라이브러리에서 fmt::format_int 를 사용하여 정수를 std::string 으로 변환할 수 있습니다.

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

또는 C 문자열:

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

후자는 동적 메모리 할당을 수행하지 않으며 Boost Karma 벤치마크에서 std::to_string 자세한 내용은 초당 1억 개의 정수를 문자열로 변환 을 참조하십시오.

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

std::to_string 과 달리 fmt::format_int 는 C++11이 필요하지 않으며 모든 C++ 컴파일러에서 작동합니다.

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


vitaut

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


Throwback1986

먼저 다음이 포함됩니다.

 #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!."

Alex

숫자 변환에 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 를 고성능 로케일 독립적 대안으로 제공합니다.


YesThatIsMyName

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++ 라이브러리의 주요 방법입니다. ostringstream 과 같이 스트림의 의도된 사용을 추가로 제한하는 stringstream 과 유사한 자매 함수가 있습니다. 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마이크로초(내 컴퓨터에서)가 소요되며 중복으로 수행되는 경우 나중에 속도가 상당히 빨라지지만 이전 기능만큼 많지는 않습니다 .


물론 다른 옵션이 있으며 이 중 하나를 자신의 함수로 래핑할 수도 있지만 이는 인기 있는 몇 가지 옵션을 분석적으로 보여줍니다.


Joshua Detwiler

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


user10133158

스트림과 같은 방식으로 즉석에서 문자열을 구성할 수 있는 구문 설탕을 추가하는 것은 다소 쉽습니다.

 #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();} };

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

예시:

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

AndreyS Scherbakov

편집됨. 고정 자릿수 를 가진 정수를 '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;

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

 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;

참고: 빅 엔디안 바이트 순서로 필요한 경우 테스트하지는 않았지만 여기에 예가 있습니다. 세 자리 숫자의 경우 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; 나는 그것이 작동해야한다고 생각합니다.


Alek

사용하다:

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

maverick9888

나는 사용한다:

 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 ++ 컴파일러에서 작동합니다.


J_C

여기 또 다른 쉬운 방법이 있습니다

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

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

세 번째 줄과 같이 char * 배열을 문자열로 변환할 수 있습니다.


Natesh bhat

이것은 나를 위해 일했습니다 -

내 코드:

 #include <iostream> using namespace std; int main() { int n = 32; string s = to_string(n); cout << "string: " + s << endl; return 0; }

Gonçalo Garrido

C++11은 숫자 유형에 대해 std::to_string()

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

Kamrujjaman Joy

int i = 255; std::string s = std::to_string(i);

C++에서 to_string()은 값을 일련의 문자로 표시하여 정수 값의 문자열 객체를 생성합니다.


Archie

일반 표준 stdio 헤더를 사용하면 다음과 같이 sprintf 를 통해 정수를 버퍼로 캐스팅할 수 있습니다.

 #include <stdio.h> int main() { int x=23; char y[2]; //the output buffer sprintf(y,"%d",x); printf("%s",y) }

필요에 따라 버퍼 크기를 관리하는 것을 잊지 마십시오[문자열 출력 크기]


PYK

사용하다:

 #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; bool isNegative = num < 0; if(isNegative) num*=-1; do { char toInsert = (num % 10) + 48; numAsStr.insert(0, 1, toInsert); num /= 10; }while (num); return isNegative? numAsStr.insert(0, 1, '-') : numAsStr; }

Tayyab Mazhar

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; }

Abdullah Abdelmonem

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

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

Tur1ng

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

user2047065

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) 사용할 수 있습니다.


user1363411

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; }

rashedcs

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

  • 정수를 취하고 10의 거듭제곱으로 가중치가 부여된 각 숫자를 취합니다. 따라서 정수가 950이라고 가정합니다.

    • 정수가 100,000보다 크거나 같으면 100,000을 빼고 ["000000"]에서 문자열의 카운터를 늘립니다.
      위치 100,000에 숫자가 더 이상 없을 때까지 계속하십시오. 10의 거듭제곱을 더 떨어뜨립니다.

    • 정수가 10,000보다 크거나 같으면 10,000을 빼고 문자열의 카운터를 ["000000"] + 1 위치에서 증가시킵니다.
      위치 10,000에 더 이상 숫자가 없을 때까지 계속하십시오.

  • 10의 거듭제곱을 더 떨어뜨림

  • 패턴을 반복

950이 예제로 사용하기에는 너무 작다는 것을 알고 있지만, 아이디어를 얻으셨기를 바랍니다.


AdmiralSmith

출처 : http:www.stackoverflow.com/questions/5590381/easiest-way-to-convert-int-to-string-in-c

반응형