Satu-satunya cara yang saya tahu adalah:
#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();
}
Tetapi apakah ada metode lain dengan lebih sedikit mengetik?
c++
integer
const-char
rsk82
sumber
sumber
Jawaban:
Di C ++ 17, gunakan
std::to_chars
sebagai:Di C ++ 11, gunakan
std::to_string
sebagai:Dan di C ++ 03, apa yang Anda lakukan baik-baik saja, kecuali digunakan
const
sebagai:sumber
std::string
secara default, bukanchar*
.std::string
tersedia secara default, kecuali secara eksplisit ditentukan dalam pertanyaan itu sendiri. Masuk akal? Juga, karena pertanyaan itu sendiri menggunakanstd::string
(danstd::stringstream
), maka Anda tidak punya banyak alasan untuk tidak setuju dengannya.Saya pikir Anda bisa menggunakan sprintf:
sumber
-2147483647
.(((sizeof number) * CHAR_BIT) + 2)/3 + 2
tampak seperti sihir ...Anda bisa menggunakan boost
sumber
Solusi C-style bisa digunakan
itoa
, tetapi cara yang lebih baik adalah mencetak nomor ini menjadi string dengan menggunakansprintf
/snprintf
. Periksa pertanyaan ini: Bagaimana cara mengubah integer menjadi string secara portabel?Perhatikan bahwa
itoa
fungsi tidak ditentukan di ANSI-C dan bukan bagian dari C ++, tetapi didukung oleh beberapa kompiler. Ini adalah fungsi non-standar, jadi Anda harus menghindari penggunaannya. Periksa pertanyaan ini juga: Alternatif untuk itoa () untuk mengonversi integer ke string C ++?Perhatikan juga bahwa menulis kode gaya-C saat memprogram dalam C ++ dianggap praktik yang buruk dan terkadang disebut sebagai "gaya yang mengerikan". Anda yakin ingin mengubahnya menjadi
char*
string C-style ? :)sumber
Saya tidak akan mengetikkan const di baris terakhir karena ada karena suatu alasan. Jika Anda tidak dapat hidup dengan const char * maka Anda lebih baik menyalin array char seperti:
sumber
const char* char_type = temp_str.c_str();
lebih baik?std::vector<char> temp_vec(temp_str.begin(), temp_str.end()); temp_vec.push_back(0); char *char_type = &vec[0];
,. Ini memberi Anda memori yang bisa berubah, meskipun tentu saja Anda masih perlu menjaga vektor tetap hidup selama Anda ingin menggunakan penunjuk.string
dan jangan repot-repot dengan yang lama, polos, bodohchar *
dari yang lama, biasa C. <potongan api yang dimaksudkan>char*
, bukan "apakah ada gunanya memanggil dari C ++ ke pustaka yang ada yang ditulis dalam C, atau haruskah saya mengimplementasikannya kembali dalam C ++?" ;-pBaiklah .. pertama-tama saya membutuhkan sesuatu yang melakukan apa yang ditanyakan oleh pertanyaan ini, tetapi saya membutuhkannya CEPAT! Sayangnya cara yang "lebih baik" adalah hampir 600 baris kode !!! Maafkan namanya yang tidak ada hubungannya dengan apa yang dilakukannya. Nama yang tepat adalah Integer64ToCharArray (nilai int64_t);
https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp
Jangan ragu untuk mencoba membersihkan kode itu tanpa mengganggu kinerja.
Input: Nilai 64 bit apa pun yang ditandatangani dari kisaran minimum hingga maksimum.
Contoh:
Keluaran:
Tes Kecepatan Asli: ( Integer64ToCharArray (); )
Nilai kasus 1 digit terbaik.
Kasus Lebih Buruk Nilai 20 Digit.
Tes Kecepatan Desain Baru: ( AddDynamicallyToBuffer (); )
Nilai kasus 1 digit terbaik.
Kasus Terburuk 32 Bit - Nilai 11 digit.
Kasus Terburuk 1 Triliun Negatif - Nilai 14 digit.
Kasus 64 Bit Lebih Buruk - Nilai 20 Digit.
Bagaimana itu bekerja!
Kami Melakukan teknik Divide and Conquer dan setelah kami sekarang menjadi panjang maksimum string, kami cukup mengatur setiap nilai karakter secara individual. Seperti yang ditunjukkan dalam tes kecepatan di atas, panjang yang lebih besar mendapatkan penalti kinerja yang besar, tetapi masih jauh lebih cepat daripada metode loop asli dan tidak ada kode yang benar-benar berubah antara dua metode selain perulangan tidak lagi digunakan.
Dalam penggunaan saya maka nama saya mengembalikan offset sebagai gantinya dan saya tidak mengedit buffer array char, melainkan saya mulai memperbarui data vertex dan fungsi memiliki parameter tambahan untuk offset sehingga tidak diinisialisasi ke -1.
sumber
Lihat jawaban ini https://stackoverflow.com/a/23010605/2760919
Untuk kasus Anda, cukup ubah tipe snprintf dari long ("% ld") menjadi int ("% n").
sumber
Ini mungkin agak terlambat, tetapi saya juga memiliki masalah yang sama. Mengonversi ke char telah diatasi di C ++ 17 dengan pustaka "charconv".
https://en.cppreference.com/w/cpp/utility/to_chars
sumber
Anda juga dapat menggunakan transmisi.
contoh:
sumber