Ich weiß nur:
#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();
}
Aber gibt es eine Methode mit weniger Eingabe?
c++
integer
const-char
rsk82
quelle
quelle
Antworten:
Verwenden Sie in C ++ 17 Folgendes
std::to_chars
:Verwenden Sie in C ++ 11 Folgendes
std::to_string
:Und in C ++ 03 ist das, was Sie tun, in Ordnung, außer
const
als:quelle
std::string
standardmäßig anstelle von verwendenchar*
.std::string
, dass es standardmäßig verfügbar ist, es sei denn, es ist in der Frage selbst explizit angegeben. Macht Sinn? Da die Frage selbststd::string
(undstd::stringstream
) verwendet, haben Sie nicht viel Grund, damit nicht einverstanden zu sein.Ich denke, Sie können einen Sprintf verwenden:
quelle
-2147483647
.(((sizeof number) * CHAR_BIT) + 2)/3 + 2
sieht aus wie Zauberei ...Sie können Boost verwenden
quelle
Eine Lösung im C-Stil könnte die Verwendung sein
itoa
, aber besser ist es, diese Zahl mitsprintf
/snprintf
in eine Zeichenfolge zu drucken . Überprüfen Sie diese Frage: Wie konvertiere ich eine Ganzzahl portabel in eine Zeichenfolge?Beachten Sie, dass die
itoa
Funktion nicht in ANSI-C definiert ist und nicht Teil von C ++ ist, sondern von einigen Compilern unterstützt wird. Es ist eine nicht standardmäßige Funktion, daher sollten Sie sie nicht verwenden. Überprüfen Sie auch diese Frage: Alternative zu itoa () zum Konvertieren von Ganzzahlen in Zeichenfolgen C ++?Beachten Sie auch, dass das Schreiben von Code im C-Stil während des Programmierens in C ++ als schlechte Praxis angesehen wird und manchmal als "grässlicher Stil" bezeichnet wird. Möchten Sie es wirklich in eine
char*
Zeichenfolge im C-Stil konvertieren ? :) :)quelle
Ich würde die Konstante in der letzten Zeile nicht wegschreiben, da sie aus einem bestimmten Grund vorhanden ist. Wenn Sie nicht mit einem const char * leben können, kopieren Sie das char-Array besser wie folgt:
quelle
const char* char_type = temp_str.c_str();
ist besserstd::vector<char> temp_vec(temp_str.begin(), temp_str.end()); temp_vec.push_back(0); char *char_type = &vec[0];
. Dies gibt Ihnen veränderlichen Speicher, obwohl Sie den Vektor natürlich noch so lange am Leben halten müssen, wie Sie den Zeiger verwenden möchten.string
undchar *
char*
, nicht "gibt es irgendeinen Grund , von C ++ in vorhandene Bibliotheken aufzurufen, die in C geschrieben sind, oder sollte ich sie in C ++ erneut implementieren?" ;-pOkay ... zuerst brauchte ich etwas, das das tat, was diese Frage stellt, aber ich brauchte es SCHNELL! Leider ist der "bessere" Weg fast 600 Codezeilen !!! Verzeihen Sie den Namen, der nichts mit dem zu tun hat, was er tut. Der richtige Name war Integer64ToCharArray (int64_t-Wert);
https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp
Versuchen Sie, diesen Code zu bereinigen, ohne die Leistung zu beeinträchtigen.
Eingabe: Beliebiger vorzeichenbehafteter 64-Bit-Wert vom Min- bis Max-Bereich.
Beispiel:
Ausgabe:
Ursprüngliche Geschwindigkeitstests: ( Integer64ToCharArray (); )
Bester Fall 1-stelliger Wert.
Schlimmer Fall 20-stelliger Wert.
Neue Entwurfsgeschwindigkeitstests: ( AddDynamicallyToBuffer (); )
Bester Fall 1-stelliger Wert.
32 Bit Worst Case - 11-stelliger Wert.
Negativ 1 Billion Worst Case - 14-stelliger Wert.
64-Bit-Worse-Case - 20-stelliger Wert.
Wie es funktioniert!
Wir führen eine Divide and Conquer-Technik durch und sobald wir nun die maximale Länge der Zeichenfolge erreicht haben, setzen wir einfach jeden Zeichenwert einzeln. Wie in den obigen Geschwindigkeitstests gezeigt, erhalten die größeren Längen große Leistungseinbußen, aber es ist immer noch viel schneller als die ursprüngliche Schleifenmethode, und zwischen den beiden Methoden hat sich kein Code geändert, außer dass die Schleife nicht mehr verwendet wird.
In meiner Verwendung, daher der Name, gebe ich stattdessen den Offset zurück und bearbeite keinen Puffer mit Zeichenarrays. Stattdessen beginne ich mit der Aktualisierung der Scheitelpunktdaten. Die Funktion verfügt über einen zusätzlichen Parameter für den Offset, sodass dieser nicht auf -1 initialisiert wird.
quelle
Siehe diese Antwort https://stackoverflow.com/a/23010605/2760919
Ändern Sie für Ihren Fall einfach den Typ in snprintf von long ("% ld") in int ("% n").
quelle
Das mag etwas spät sein, aber ich hatte auch das gleiche Problem. Die Konvertierung in char wurde in C ++ 17 mit der Bibliothek "charconv" behandelt.
https://en.cppreference.com/w/cpp/utility/to_chars
quelle
Sie können auch Casting verwenden.
Beispiel:
quelle