konvertiert man einen String in Unsigned char in C++ ...Wie ein Stringliteral in unsigned char-Array in Visual C++
wollenIch habe konvertieren
unsigned char m_Test[8];
ich eine Zeichenfolge zuweisen "Hello world"
zu m_Test
.
wie geht das?
konvertiert man einen String in Unsigned char in C++ ...Wie ein Stringliteral in unsigned char-Array in Visual C++
wollenIch habe konvertieren
unsigned char m_Test[8];
ich eine Zeichenfolge zuweisen "Hello world"
zu m_Test
.
wie geht das?
Erstens hat das Array zumindest groß genug sein, um die Schnur zu halten:
unsigned char m_Test[20];
dann verwenden Sie strcpy. Sie müssen den ersten Parameter werfen eine Warnung zu vermeiden:
strcpy((char*) m_Test, "Hello World");
Oder wenn Sie ein C++ puristisch sein wollen:
strcpy(static_cast <char*>(m_Test), "Hello World");
Wenn Sie die Zeichenfolge initialisieren wollen, anstatt zuweisen es, könnten Sie auch sagen:
unsigned char m_Test[20] = "Hello World";
Vielleicht erwähnenswert, dass Sie die Größe im letzten Beispiel fallen lassen können, da der Compiler es herausfinden wird. –
können Sie strcpy Funktion verwenden Aber bedenken Sie, dass m_Test nur 8 Größe ist und es wird einen Überlauf geben. Strcpy prüft, ob nicht, und Sie werden eine Ausnahme
char * strcpy (char * destination, const char * source);
Sie können c_str()
Funktion von std::string
verwenden erhalten die char*
aus Zeichenfolge zu erhalten. Diese Methode gibt im Grunde einen Zeiger auf c-style String zurück. Danach können Sie die normalen Funktionen zum Kopieren von Zeichenfolgen wie strcpy
oder strncpy
verwenden, um den Wert in test
zu kopieren.
Sie können strcpy
verwenden:
unsigned char m_Test[8];
strcpy((char*)m_Test, "Hello world");
Beachten Sie, dass "Hallo Welt" 8 Bytes für zu lang ist, so dass Sie wahrscheinlich eine segfault bekommen.
strncpy(m_Test, "Hello world", sizeof(m_Test));
Hier Wikipedia auf strncpy:
für alle praktischen Zwecke sind die strcpy Antworten richtig sind, mit dem Hinweis, dass 8 nicht groß genug für die Zeichenfolge ist.
Wenn Sie wirklich pedantisch sein wollen, können Sie so etwas wie dieses benötigen:
#include <algorithm>
int main() {
const char greeting[] = "Hello world";
unsigned char m_Test[sizeof(greeting)];
std::copy(greeting, greeting + sizeof(greeting), m_Test);
}
Der Grund dafür ist, dass std :: Kopie wird in der ursprünglichen Zeichenfolge zu unsigned char
die Zeichen konvertieren. strcpy führt dazu, dass die Zeichen in der ursprünglichen Zeichenfolge als unsigned char
uminterpretiert werden. Du sagst nicht, welches du willst.
Der Standard lässt zu, dass es einen Unterschied zwischen den beiden gibt, obwohl es sehr selten ist: Sie müssten char
signieren, in einer Implementierung mit einer 1s 'Komplement- oder Vorzeichen-Repräsentation. Sie können die Möglichkeit ziemlich ignorieren, aber IMO ist es wert, darüber zu wissen, weil es die lustigen Warnungen erklärt, die gute Compiler Ihnen geben, wenn Sie Zeiger auf char
und unsigned char
mischen.
Ein Array muss einen konstanten Wert zwischen [] haben und keine Variablen oder Funktionen verwenden. C++ Regeln. –
Meistens stimmt, aber 'sizeof' ist keine Funktion und' sizeof (gruß) 'ist ein ganzzahliger konstanter Ausdruck. Sie können "Variablen" in ganzzahligen Konstantenausdrücken auf bestimmte Arten verwenden, und dies ist eine davon, da der Wert von 'gruß' nicht verwendet wird, nur der Typ, der 'const char [12]' ist. –
'strlen (Gruß)' wäre in C++ nicht erlaubt, aus dem Grund, den Sie sagen. –
Ich habe den Titel der Frage geändert, da in der Tat, was Sie konvertieren möchten, ein String-Literal ist. Eine Zeichenfolge ist eine Klasse in C++ und der Titel war irreführend. Hoffe, es macht Ihnen nichts aus. –
@IvayloStrandjev der aktuelle Titel ist extrem irreführend. Die Frage ist, "wie man ein Zeichenfolgenliteral einem Zeichenfeld ohne Vorzeichen zuordnen kann" und nicht "wie man ein Zeichenfolgenliteral in Zeichen ohne Vorzeichen umwandelt". Und selbst wenn die Richtung korrekt war, ist es ein Zeichenfeld ohne Vorzeichen, kein Zeichen ohne Vorzeichen. –
@Mike korrigieren Ich habe behoben, dass jetzt –