int에서 char *로 변환하는 방법?


98

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

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

그러나 타이핑이 적은 방법이 있습니까?


8
왜 C ++ 문자열 대신 C- 문자열을 원하십니까?
KillianDS

1
사용 의 sprintf
Kasma

답변:


128
  • 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

1
(그것이 좋은 도움이되는 정보가 있지만 내가 그 기능을 인식하지 않았다으로) 첫 번째 부분은 실제로 질문에 대답하지 않습니다
jcoder

1
더 나은 :) 또한 C ++ 11에 대해 다시 읽어 보는 것이 좋습니다. 나는 큰 기능에 대해 알고 있지만 이로 인해 내가 놓친 작은 기능이 더 많이 있다는 것을 깨달았습니다.
jcoder

1
@Adambean : 왜 "std :: string을 포함해서는 안 되는가?" . std::string대신 기본적으로 사용해야합니다 char*.
Nawaz

1
std :: string은 특히 오래된 프로젝트에서 항상 사용할 수있는 것은 아닙니다. 많은 C ++ 게임도 여전히 std :: string에서 멀리 떨어져 있습니다. int에서 std :: string에서 char *로 이동하는 것은 int에서 char *로 이동하는 것과 동일하지 않습니다.
Adambean

1
@Adambean : C ++이면 std::string질문 자체에 명시 적으로 지정하지 않는 한 기본적으로 사용 가능 하다고 가정 합니다. 말이된다? 또한 질문 자체가 std::string(및 std::stringstream)을 사용하므로 동의하지 않을 이유가별로 없습니다.
Nawaz

11

sprintf를 사용할 수 있다고 생각합니다.

int number = 33;
char* numberstring[(((sizeof number) * CHAR_BIT) + 2)/3 + 2];
sprintf(numberstring, "%d", number);

1
당신은 지금 포인터의 배열입니다 numberstring, 문자로 문자의 *을 변경해야합니다
josefx

1
또한 32 비트 정수를 nul로 끝나는 10 진법 표현으로 변환하려면 12자가 필요합니다. 10은 -2147483647.
Steve Jessop

11
설명 좀 어때? (((sizeof number) * CHAR_BIT) + 2)/3 + 2마법처럼 보입니다 ...
Mike S

7

부스트를 사용할 수 있습니다

#include <boost/lexical_cast.hpp>
string s = boost::lexical_cast<string>( number );

5

C 스타일 솔루션은를 사용하는 itoa것이지만 더 좋은 방법은 sprintf/snprintf 를 사용하여이 숫자를 문자열로 인쇄하는 것 입니다. 이 질문을 확인하십시오 : 정수를 이식 가능하게 문자열로 변환하는 방법?

참고 itoa함수는 ANSI-C에 정의되지 않은 및 C ++의 일부가 아니라, 어떤 컴파일러에 의해 지원된다. 비표준 기능이므로 사용을 피해야합니다. 이 질문도 확인하십시오 : 정수를 문자열 C ++로 변환하는 itoa ()의 대안입니까?

또한 C ++로 프로그래밍하는 동안 C 스타일 코드를 작성하는 것은 나쁜 습관으로 간주되며 때때로 "끔찍한 스타일"이라고도합니다. 정말 C 스타일 char*문자열 로 변환 하시겠습니까? :)


5

나는 이유가 있기 때문에 마지막 줄에서 const를 typecast하지 않을 것입니다. const char *로 살 수 없다면 다음과 같이 char 배열을 복사하는 것이 좋습니다.

char* char_type = new char[temp_str.length()];
strcpy(char_type, temp_str.c_str());

const char* char_type = temp_str.c_str();더 낫다는 뜻 입니까?
rsk82

1
예. c_str은 문자열 객체의 내부 버퍼에 대한 포인터를 제공합니다. const를 버리면 당신이나 다른 프로그래머는 non-const 변수를 통해 버퍼를 변경하는 것이 좋다고 생각할 수 있습니다. 하지만 그렇지 않습니다. 원래 문자열 객체는 이러한 변경 사항에 대해 아무것도 모릅니다. 반면에 문자열은 여전히 ​​버퍼를 소유합니다. 문자열 개체가 범위를 벗어나면 포인터 뒤에있는 메모리가 문자열 개체 소멸자에 의해 삭제되어 매달려있는 포인터가 남습니다. 복사 작업은 두 문제를 모두 제거합니다.
user331471

1
또는 std::vector<char> temp_vec(temp_str.begin(), temp_str.end()); temp_vec.push_back(0); char *char_type = &vec[0];. 물론 포인터를 사용하려는 한 벡터를 계속 유지해야하지만 변경 가능한 메모리를 제공합니다.
Steve Jessop

1
또는 그냥 사용 string하고 낡고, 평범하고, 어리석은 char *낡고, 평범한 C로 귀찮게하지 마십시오 . <의도 된 불꽃의 비트>
Griwes

@Griwes : 질문은 char*"C ++에서 C로 작성된 기존 라이브러리로 호출하는 지점이 있습니까? 아니면 C ++로 다시 구현해야합니까?"가 아니라 에 도달하는 방법입니다. ;-p
스티브 Jessop

2

좋아 .. 먼저이 질문이 요구하는 것을 수행하는 것이 필요했지만 빨리 필요했습니다! 불행히도 "더 나은"방법은 거의 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로 초기화되지 않습니다.




0

캐스팅을 사용할 수도 있습니다.

예:

string s;
int value = 3;
s.push_back((char)('0' + value));

1
값이 음수이거나 숫자가 아니면?
Ziya ERKOC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.