私が知る唯一の方法は:
#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();
}
しかし、タイピングが少ない方法はありますか?
私が知る唯一の方法は:
#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
std::string
デフォルトではなく、を使用する必要がありますchar*
。
std::string
、質問自体で明示的に指定されていない限り、デフォルトで使用可能であると想定します。理にかなっていますか?また、質問自体がstd::string
(およびstd::stringstream
)を使用しているため、それに同意する理由はあまりありません。
私はあなたがsprintfを使うことができると思います:
int number = 33;
char* numberstring[(((sizeof number) * CHAR_BIT) + 2)/3 + 2];
sprintf(numberstring, "%d", number);
-2147483647
。
(((sizeof number) * CHAR_BIT) + 2)/3 + 2
魔法のように見える...
Cスタイルの解決策はを使用することitoa
ですが、より良い方法はsprintf
/snprintf
を使用してこの数値を文字列に出力することです。この質問を確認してください:移植性のある整数を文字列に変換する方法?
itoa
関数はANSI-Cで定義されておらず、C ++の一部ではありませんが、一部のコンパイラでサポートされていることに注意してください。これは非標準の関数であるため、使用しないでください。この質問もチェックしてください:整数を文字列C ++に変換するためのitoa()の代替?
また、C ++でのプログラミング中にCスタイルのコードを書くことは悪い習慣と見なされ、「恐ろしいスタイル」と呼ばれることもあります。本当にCスタイルのchar*
文字列に変換しますか?:)
理由があるので、私は最後の行のconstを型キャストしません。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();
良いですか?
std::vector<char> temp_vec(temp_str.begin(), temp_str.end()); temp_vec.push_back(0); char *char_type = &vec[0];
。これは可変メモリを提供しますが、もちろん、ポインタを使用したい限り、ベクトルを存続させる必要があります。
string
してchar *
、古くてプレーンなCからの古くてプレーンな愚かなことに気をつけないでください。<意図した炎の
char*
、「C ++からCで記述された既存のライブラリを呼び出すポイントがあるのか、それともC ++で再実装する必要があるのか」ではなく、にアクセスする方法です。;-p
さて、最初に、この質問がすることを実行する何かが必要でしたが、私はそれを速く必要としました!残念ながら、「より良い」方法は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(ナノ)
使い方!
分割統治テクニックを実行し、文字列の最大長になったら、各文字の値を個別に設定します。上記の速度テストに示されているように、長さが長いほどパフォーマンスが大幅に低下しますが、元のループメソッドよりもはるかに速く、2つのメソッド間で実際にコードが変更されておらず、ループは使用されていません。
私の使用法では、このため、代わりにオフセットを返し、char配列のバッファーを編集せず、頂点データの更新を開始し、関数にオフセットの追加パラメーターがあるため、-1に初期化されません。
この回答を参照してくださいhttps://stackoverflow.com/a/23010605/2760919
あなたの場合は、snprintfのタイプをlong( "%ld")からint( "%n")に変更してください。
これは少し遅れるかもしれませんが、同じ問題がありました。charへの変換は、C ++ 17の「charconv」ライブラリで対処されました。
キャストも使用できます。
例:
string s;
int value = 3;
s.push_back((char)('0' + value));