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();
질문자 :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 atoi
및 itoa
std::string
표현됩니다.
#include <string> std::string s = std::to_string(42);
따라서 내가 생각할 수있는 가장 짧은 방법입니다. auto
키워드를 사용하여 유형 이름 지정을 생략할 수도 있습니다.
auto s = std::to_string(42);
참고: [string.conversions] 참조( n3242의 21.5 )
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<>
사용할 수 없는 경우). 이러한 다른 솔루션은 모두 더 나은 성능을 제공합니다.
나는 일반적으로 다음 방법을 사용합니다.
#include <sstream> template <typename T> std::string NumberToString ( T Number ) { std::ostringstream ss; ss << Number; return ss.str(); }
여기 에 자세히 설명되어 있습니다.
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++11 이전) 컴파일러의 경우 아마도 가장 일반적인 쉬운 방법은 기본적으로 두 번째 선택을 Boost 에 있는 것과 같은 lexical_cast
라는 템플릿으로 래핑하므로 코드는 다음과 같습니다.
int a = 10; string s = lexical_cast<string>(a);
이것의 한 가지 좋은 점은 다른 캐스트도 지원한다는 것입니다(예: 반대 방향에서도 잘 작동함).
또한 Boost lexical_cast
stringstream
쓰는 것으로 시작하여 스트림에서 다시 추출했지만 이제 몇 가지 추가 사항이 있습니다. 우선, 꽤 많은 유형에 대한 전문화가 추가되었으므로 많은 일반 유형의 경우 stringstream
사용하는 것보다 훨씬 빠릅니다. 둘째, 지금 그래서, 결과를 확인 당신이에 문자열로 변환하는 경우 (예를 들어) int
, 그것은 문자열이 변환 할 수없는 뭔가가 포함되어있는 경우 예외를 던질 수 int
예는, ( 1234
성공할 것이다, 그러나 123abc
는 던질 것입니다).
Boost가 설치되어 있는 경우(설치해야 함):
#include <boost/lexical_cast.hpp> int num = 4; std::string str = boost::lexical_cast<std::string>(num);
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(); }
순수한 C++에서 내가 아는 것은 아닙니다. 그러나 당신이 언급 한 것을 약간 수정하면
string s = string(itoa(a));
작동해야 하며 매우 짧습니다.
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} 라이브러리의 저자입니다.
sprintf()
는 형식 변환에 꽤 좋습니다. 그런 다음 1에서와 같이 결과 C 문자열을 C++ 문자열에 할당할 수 있습니다.
먼저 다음이 포함됩니다.
#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!."
숫자 변환에 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
를 고성능 로케일 독립적 대안으로 제공합니다.
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마이크로초(내 컴퓨터에서)가 소요되며 중복으로 수행되는 경우 나중에 속도가 상당히 빨라지지만 이전 기능만큼 많지는 않습니다 .
물론 다른 옵션이 있으며 이 중 하나를 자신의 함수로 래핑할 수도 있지만 이는 인기 있는 몇 가지 옵션을 분석적으로 보여줍니다.
C++17은 고성능 로케일 독립적 대안으로 std::to_chars
스트림과 같은 방식으로 즉석에서 문자열을 구성할 수 있는 구문 설탕을 추가하는 것은 다소 쉽습니다.
#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; }
편집됨. 고정 자릿수 를 가진 정수를 '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;
나는 그것이 작동해야한다고 생각합니다.
사용하다:
#define convertToString(x) #x int main() { convertToString(42); // Returns const char* equivalent of 42 }
나는 사용한다:
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 ++ 컴파일러에서 작동합니다.
여기 또 다른 쉬운 방법이 있습니다
char str[100]; sprintf(str, "%d", 101); string s = str;
sprintf
는 모든 데이터를 필요한 형식의 문자열에 삽입하는 것으로 잘 알려져 있습니다.
세 번째 줄과 같이 char *
배열을 문자열로 변환할 수 있습니다.
이것은 나를 위해 일했습니다 -
내 코드:
#include <iostream> using namespace std; int main() { int n = 32; string s = to_string(n); cout << "string: " + s << endl; return 0; }
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
int i = 255; std::string s = std::to_string(i);
C++에서 to_string()은 값을 일련의 문자로 표시하여 정수 값의 문자열 객체를 생성합니다.
일반 표준 stdio 헤더를 사용하면 다음과 같이 sprintf 를 통해 정수를 버퍼로 캐스팅할 수 있습니다.
#include <stdio.h> int main() { int x=23; char y[2]; //the output buffer sprintf(y,"%d",x); printf("%s",y) }
필요에 따라 버퍼 크기를 관리하는 것을 잊지 마십시오[문자열 출력 크기]
사용하다:
#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; }
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; }
MFC 를 사용하는 경우 CString
을 사용할 수 있습니다.
int a = 10; CString strA; strA.Format("%d", a);
char * bufSecs = new char[32]; char * bufMs = new char[32]; sprintf(bufSecs, "%d", timeStart.elapsed()/1000); sprintf(bufMs, "%d", timeStart.elapsed()%1000);
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)
사용할 수 있습니다.
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; }
카운터 유형의 알고리즘을 사용하여 문자열로 변환합니다. 나는 이 기술을 Commodore 64 컴퓨터 프로그래밍에서 얻었습니다. 게임 프로그래밍에도 좋습니다.
정수를 취하고 10의 거듭제곱으로 가중치가 부여된 각 숫자를 취합니다. 따라서 정수가 950이라고 가정합니다.
정수가 100,000보다 크거나 같으면 100,000을 빼고 ["000000"]에서 문자열의 카운터를 늘립니다.
위치 100,000에 숫자가 더 이상 없을 때까지 계속하십시오. 10의 거듭제곱을 더 떨어뜨립니다.
정수가 10,000보다 크거나 같으면 10,000을 빼고 문자열의 카운터를 ["000000"] + 1 위치에서 증가시킵니다.
위치 10,000에 더 이상 숫자가 없을 때까지 계속하십시오.
10의 거듭제곱을 더 떨어뜨림
950이 예제로 사용하기에는 너무 작다는 것을 알고 있지만, 아이디어를 얻으셨기를 바랍니다.
출처 : http:www.stackoverflow.com/questions/5590381/easiest-way-to-convert-int-to-string-in-c
git에서 이름으로 숨김의 이름을 지정하고 검색하는 방법은 무엇입니까? (0) | 2021.12.31 |
---|---|
Git은 심볼릭 링크를 어떻게 처리합니까? (0) | 2021.12.31 |
Git 병합 대신 Git 리베이스를 언제 사용합니까? (0) | 2021.12.31 |
인덱스로 목록에서 요소를 제거하는 방법 (0) | 2021.12.31 |
Python의 정적 메서드? (0) | 2021.12.31 |