web-dev-qa-db-ja.com

intからchar *に変換する方法?

私が知る唯一の方法は、

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

しかし、タイピングの少ない方法はありますか?

87
rsk82
  • 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
    
110
Nawaz

私はあなたがスプリントを使用することができると思います:

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 );
8
maverik

Cスタイルの解決策としては itoa を使用することが考えられますが、 sprintf/snprintf を使用してこの数字を文字列に出力することをお勧めします。この質問をチェックしてください: どのように移植可能に整数を文字列に変換しますか?

itoa functionはANSI-Cでは定義されておらず、C++の一部でもありませんが、一部のコンパイラではサポートされています。これは標準的ではない機能なので、使用しないでください。この質問もチェックしてください。 整数を文字列C++に変換するためのitoa()の代わりに?

また、C++でプログラミングしながらCスタイルのコードを書くことは悪い習慣と見なされ、時には "ghastly style"と呼ばれます。本当にそれをCスタイルのchar*文字列に変換しますか? :)

5
LihO

それが理由でそこにあるので私は最後の行でconstを型キャストしないであろう。もしあなたがconst char *と共存できないのであれば、char配列を次のようにコピーしたほうがいいでしょう。

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

あなたはキャストを使うこともできます。

例:

string s;
int value = 3;
s.Push_back((char)('0' + value));
1
elmaystro

これは少し遅れるかもしれませんが、私も同じ問題を抱えていました。 charへの変換はC++ 17で "charconv"ライブラリを使って対処されました。

https://en.cppreference.com/w/cpp/utility/to_chars

1
AKJ

この回答をご覧ください https://stackoverflow.com/a/23010605/2760919

あなたの場合は、snprintfの型をlong( "%ld")からint( "%n")に変更するだけです。

1
bonnyz

さて..最初に私はこの質問が尋ねていることをした何かを必要としました、しかし私はそれを早く必要としました!残念ながら、 "より良い"方法はほぼ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(ナノ)

どのように動作しますか?

分割統治手法を実行し、文字列の最大長に達したら、各文字値を個別に設定します。上記の速度テストで示されているように、長さが大きいほどパフォーマンス上のペナルティが大きくなりますが、元のループ方法よりはるかに速く、実際に2つの方法の間でコードが変わることはありません。

私の用法では、それゆえ私は代わりにオフセットを返し、私は代わりにchar配列のバッファを編集しません。私は頂点データを更新し始めます、そしてそれは-1に初期化されません。

0
Jeremy Trifilo