int에서 char *로 변환하는 방법? int number=33;

내가 아는 유일한 방법은 다음과 같습니다.

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

https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp

성능을 방해하지 않고 코드를 정리해보십시오.

입력 : 최소에서 최대 범위까지의 부호있는 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”)로 변경하십시오.