2010-02-05 13 views
12

konvertiert man einen String in Unsigned char in C++ ...Wie ein Stringliteral in unsigned char-Array in Visual C++

wollen

Ich habe konvertieren

unsigned char m_Test[8]; 

ich eine Zeichenfolge zuweisen "Hello world" zu m_Test.

wie geht das?

+0

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. –

+0

@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. –

+0

@Mike korrigieren Ich habe behoben, dass jetzt –

Antwort

17

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"; 
+6

Vielleicht erwähnenswert, dass Sie die Größe im letzten Beispiel fallen lassen können, da der Compiler es herausfinden wird. –

1

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); 
+1

könnte strncpy ... verwenden? – Goz

+0

Aber es wird sowieso nicht die ganze Zeichenfolge kopieren. Ich glaube, der Hauptzweck ist es, die ganze Saite zu kopieren. – anthares

+0

"Sie werden eine Ausnahme bekommen" - wenn Sie Glück haben. –

1

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.

1

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.

2

Sie können eine Zeichenfolge Kopierfunktion wie strcpy verwenden oder noch besser strncpy, die auch einige Maßprüfungen hat:

strncpy ((char*) m_Test,"Hello World",8); 
4
strncpy(m_Test, "Hello world", sizeof(m_Test)); 

Hier Wikipedia auf strncpy:

3

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.

+0

Ein Array muss einen konstanten Wert zwischen [] haben und keine Variablen oder Funktionen verwenden. C++ Regeln. –

+2

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. –

+0

'strlen (Gruß)' wäre in C++ nicht erlaubt, aus dem Grund, den Sie sagen. –