Jedyny sposób, jaki znam, to:
#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();
}
Ale czy jest jakaś metoda wymagająca mniej pisania?
c++
integer
const-char
rsk82
źródło
źródło
Odpowiedzi:
W C ++ 17 użyj
std::to_chars
jako:W C ++ 11 użyj
std::to_string
jako:A w C ++ 03 to, co robisz, jest w porządku, z wyjątkiem używania
const
jako:źródło
std::string
domyślnie zamiastchar*
.std::string
jest dostępny domyślnie, chyba że jest to wyraźnie określone w samym pytaniu. Ma sens? Ponadto, ponieważ samo pytanie używastd::string
(istd::stringstream
), nie masz zbyt wielu powodów, aby się z nim nie zgadzać.Myślę, że możesz użyć sprinta:
źródło
-2147483647
.(((sizeof number) * CHAR_BIT) + 2)/3 + 2
wygląda jak magia ...Możesz użyć doładowania
źródło
Przydałoby się rozwiązanie w stylu C
itoa
, ale lepszym sposobem jest wydrukowanie tej liczby w łańcuchu za pomocąsprintf
/snprintf
. Sprawdź to pytanie: Jak przenośnie przekonwertować liczbę całkowitą na ciąg?Zauważ, że
itoa
funkcja nie jest zdefiniowana w ANSI-C i nie jest częścią C ++, ale jest obsługiwana przez niektóre kompilatory. Jest to funkcja niestandardowa, dlatego należy jej unikać. Sprawdź też to pytanie: Alternatywa dla itoa () do konwersji liczby całkowitej na łańcuch C ++?Należy również zauważyć, że pisanie kodu w stylu C podczas programowania w C ++ jest uważane za złą praktykę i czasami nazywane jest „upiornym stylem”. Czy na pewno chcesz przekształcić go w
char*
napis w stylu C ? :)źródło
Nie zapisałbym stałej w ostatnim wierszu, ponieważ jest tam z jakiegoś powodu. Jeśli nie możesz żyć z const char *, lepiej skopiuj tablicę char, na przykład:
źródło
const char* char_type = temp_str.c_str();
lepsze?std::vector<char> temp_vec(temp_str.begin(), temp_str.end()); temp_vec.push_back(0); char *char_type = &vec[0];
. Daje to zmienną pamięć, chociaż oczywiście nadal musisz utrzymywać wektor przy życiu tak długo, jak chcesz używać wskaźnika.string
i nie przejmuj się starym, prostym, głupimchar *
ze starego, zwykłego C. <zamierzone kawałki ognia>char*
, a nie „czy jest jakiś sens wywoływać z C ++ do istniejących bibliotek napisanych w C, czy powinienem ponownie zaimplementować je w C ++?” ;-pW porządku… po pierwsze potrzebowałem czegoś, co spełniło to pytanie, ale potrzebowałem tego SZYBKO! Niestety „lepszym” sposobem jest prawie 600 linii kodu !!! Wybaczcie nazwę tego, która nie ma nic wspólnego z tym, co robi. Właściwa nazwa to Integer64ToCharArray (wartość int64_t);
https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp
Możesz spróbować wyczyścić ten kod bez obniżania wydajności.
Wejście: Dowolna wartość 64-bitowa ze znakiem od minimalnego do maksymalnego zakresu.
Przykład:
Wynik:
Oryginalne testy prędkości: ( Integer64ToCharArray (); )
Wartość jednocyfrowa w najlepszym przypadku.
Gorsza 20-cyfrowa wartość przypadku.
Nowe testy szybkości projektowania: ( AddDynamicallyToBuffer (); )
Wartość jednocyfrowa w najlepszym przypadku.
Najgorszy przypadek 32-bitowy - 11-cyfrowa wartość.
Ujemny 1 bilion Najgorszy przypadek - 14-cyfrowa wartość.
64-bitowy gorszy przypadek - wartość 20 cyfr.
Jak to działa!
Wykonujemy technikę dzielenia i zwyciężania i po ustaleniu maksymalnej długości ciągu po prostu ustawiamy każdą wartość znaku indywidualnie. Jak pokazano w powyższych testach szybkości, większe długości powodują duże kary za wydajność, ale nadal jest znacznie szybsza niż oryginalna metoda pętli i żaden kod nie zmienił się między tymi dwiema metodami, a pętla nie jest już używana.
W moim użyciu stąd nazwa, zamiast tego zwracam przesunięcie i nie edytuję buforu tablic char, raczej zaczynam aktualizować dane wierzchołków, a funkcja ma dodatkowy parametr przesunięcia, więc nie jest zainicjowana na -1.
źródło
Zobacz tę odpowiedź https://stackoverflow.com/a/23010605/2760919
W twoim przypadku po prostu zmień typ snprintf z long ("% ld") na int ("% n").
źródło
To może być trochę za późno, ale ja też miałem ten sam problem. Konwersja na char została rozwiązana w C ++ 17 za pomocą biblioteki „charconv”.
https://en.cppreference.com/w/cpp/utility/to_chars
źródło
Możesz także użyć przesyłania.
przykład:
źródło