내가 아는 유일한 방법은 다음과 같습니다.
#include <sstream>
#include <string.h>
using namespace std;
int main() {
int number=33;
stringstream strs;
strs << number;
string temp_str = strs.str();
char* char_type = (char*) temp_str.c_str();
}
그러나 타이핑이 적은 방법이 있습니까?
답변
-
C ++ 17에서는 다음
std::to_chars
과 같이 사용 합니다.std::array<char, 10> str; std::to_chars(str.data(), str.data() + str.size(), 42);
-
C ++ 11에서는 다음
std::to_string
과 같이 사용 합니다.std::string s = std::to_string(number); char const *pchar = s.c_str(); //use char const* as target type
-
그리고 C ++ 03에서는 다음
const
과 같이 사용 하는 것을 제외하고는 괜찮습니다 .char const* pchar = temp_str.c_str(); //dont use cast
답변
sprintf를 사용할 수 있다고 생각합니다.
int number = 33;
char* numberstring[(((sizeof number) * CHAR_BIT) + 2)/3 + 2];
sprintf(numberstring, "%d", number);
답변
부스트를 사용할 수 있습니다
#include <boost/lexical_cast.hpp>
string s = boost::lexical_cast<string>( number );
답변
C 스타일 솔루션은를 사용하는 itoa
것이지만 더 좋은 방법은 sprintf
/snprintf
를 사용하여이 숫자를 문자열로 인쇄하는 것 입니다. 이 질문을 확인하십시오 : 정수를 이식 가능하게 문자열로 변환하는 방법?
참고 itoa
함수는 ANSI-C에 정의되지 않은 및 C ++의 일부가 아니라, 어떤 컴파일러에 의해 지원된다. 비표준 기능이므로 사용을 피해야합니다. 이 질문도 확인하십시오 : 정수를 문자열 C ++로 변환하는 itoa ()의 대안입니까?
또한 C ++로 프로그래밍하는 동안 C 스타일 코드를 작성하는 것은 나쁜 습관으로 간주되며 때때로 “끔찍한 스타일”이라고도합니다. 정말 C 스타일 char*
문자열 로 변환 하시겠습니까? 🙂
답변
나는 이유가 있기 때문에 마지막 줄에서 const를 typecast하지 않을 것입니다. const char *로 살 수 없다면 다음과 같이 char 배열을 복사하는 것이 좋습니다.
char* char_type = new char[temp_str.length()];
strcpy(char_type, temp_str.c_str());
답변
좋아 .. 먼저이 질문이 요구하는 것을 수행하는 것이 필요했지만 빨리 필요했습니다! 불행히도 “더 나은”방법은 거의 600 줄의 코드입니다 !!! 그것이하는 일과 관련이없는 그것의 이름을 용서하십시오. 적절한 이름은 Integer64ToCharArray (int64_t value);
성능을 방해하지 않고 코드를 정리해보십시오.
입력 : 최소에서 최대 범위까지의 부호있는 64 비트 값.
예:
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MAX) << '\n';
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MIN) << '\n';
산출:
Test: 9223372036854775807
Test: -9223372036854775808
원래 속도 테스트 : ( Integer64ToCharArray (); )
최상의 경우 1 자리 값입니다.
루프 : 100,000,000, 소요 시간 : 1,381 (밀리), 루프 당 시간 13 (나노)
최악의 경우 20 자리 값.
루프 : 100,000,000, 소요 시간 : 22,656 (밀리), 루프 당 시간 226 (나노
새로운 설계 속도 테스트 : ( AddDynamicallyToBuffer (); )
최상의 경우 1 자리 값입니다.
루프 : 100,000,000, 소요 시간 : 427 (밀리), 루프 당 시간 4 (나노)
32 비트 최악의 경우-11 자리 값.
루프 : 100,000,000, 소요 시간 : 1,991 (밀리), 루프 당 시간 19 (나노)
음수 1 조 최악의 경우-14 자리 값.
루프 : 100,000,000, 소요 시간 : 5,681 (밀리), 루프 당 시간 56 (나노)
64 비트 최악의 경우-20 자리 값.
루프 : 100,000,000, 소요 시간 : 13,148 (밀리), 루프 당 시간 131 (나노)
작동 원리!
Divide and Conquer 기술을 수행하고 이제 문자열의 최대 길이가되면 각 문자 값을 개별적으로 설정하기 만하면됩니다. 위의 속도 테스트에서 볼 수 있듯이 길이가 길수록 성능이 크게 저하되지만 원래 루프 방법보다 훨씬 빠르며 루프가 더 이상 사용되지 않는 두 방법간에 코드가 실제로 변경되지 않았습니다.
내 사용법에서는 대신 오프셋을 반환하고 char 배열의 버퍼를 편집하지 않고 정점 데이터 업데이트를 시작하고 함수에는 오프셋에 대한 추가 매개 변수가 있으므로 -1로 초기화되지 않습니다.
답변
이 답변 참조 https://stackoverflow.com/a/23010605/2760919
귀하의 경우 snprintf의 유형을 long ( “% ld”)에서 int ( “% n”)로 변경하십시오.