2010-02-05 13 views
12

Come convertire una stringa in unsigned char in C++ ...Come convertire una stringa letterale di array di caratteri senza segno Visual C++

ho,

unsigned char m_Test[8]; 

voglio assegnare una stringa "Hello world" a m_Test.

come si fa?

+0

Ho cambiato il titolo della domanda in quanto in realtà ciò che si desidera convertire è una stringa letterale. Una stringa è una classe std in C++ e il titolo era fuorviante. Spero non ti dispiaccia. –

+0

@IvayloStrandjev il titolo attuale è estremamente fuorviante. La domanda è "come assegnare una stringa letterale a un array di caratteri non firmati" non "come convertire una stringa da lettera a carattere senza segno". E anche se hai avuto la direzione corretta, si tratta di un array di caratteri senza segno, non di un carattere senza segno. –

+0

@Mike corretto Ho corretto che ora –

risposta

17

In primo luogo, l'array deve essere almeno abbastanza grande da contenere la stringa:

unsigned char m_Test[20]; 

quindi usi strcpy. È necessario lanciare il primo parametro per evitare un avvertimento:

strcpy((char*) m_Test, "Hello World"); 

Oppure, se si vuole essere un C puristi ++:

strcpy(static_cast <char*>(m_Test), "Hello World"); 

Se si desidera inizializzare la stringa piuttosto che assegnarlo, si potrebbe anche dire:

unsigned char m_Test[20] = "Hello World"; 
+6

Forse vale la pena ricordare che è possibile eliminare la dimensione nell'ultimo esempio, poiché il compilatore lo individuerà. –

1

è possibile utilizzare la funzione strcpy Ma tenere presente che m_Test ha solo 8 dimensioni e che ci sarà un overflow. Strcpy non controllerà che e si otterrà un'eccezione

char * strcpy (char * destination, const char * source); 
+1

potrebbe usare strncpy ...? – Goz

+0

Ma non copierà comunque l'intera stringa. Credo che lo scopo principale sia quello di copiare l'intera stringa. – anthares

+0

"riceverai un'eccezione" - se sei fortunato. –

1

È possibile utilizzare la funzione di c_str()std::string per ottenere il char* di stringa. Questo metodo restituisce fondamentalmente un puntatore alla stringa in stile c. Successivamente è possibile utilizzare le normali funzioni di copia delle stringhe come strcpy o strncpy per copiare il valore in test.

1

È possibile utilizzare strcpy:

unsigned char m_Test[8]; 
strcpy((char*)m_Test, "Hello world"); 

nota che "Ciao mondo" è troppo lungo per 8 byte, quindi probabilmente otterrete un segfault.

2

È possibile utilizzare una funzione di copia stringa come strcpy o meglio ancora strncpy, che ha anche alcuni controlli di dimensioni:

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

Ecco Wikipedia su strncpy:

3

Per tutti gli scopi pratici, le risposte strcpy sono corrette, con la nota che 8 non è abbastanza grande per la stringa.

Se si vuole essere davvero pedanti, potrebbe essere necessario qualcosa di simile:

#include <algorithm> 

int main() { 
    const char greeting[] = "Hello world"; 
    unsigned char m_Test[sizeof(greeting)]; 
    std::copy(greeting, greeting + sizeof(greeting), m_Test); 
} 

La ragione è che std :: copia sarà convertire i caratteri della stringa originale per unsigned char. strcpy restituirà i caratteri nella stringa originale che sono reinterpretati come unsigned char. Non dici quale vuoi.

I permessi standard, che vi sia una differenza tra i due, anche se è molto raro: avresti bisogno char da firmare, in un'implementazione con il complemento a 1s' oppure registrati grandezza rappresentazione. Puoi quasi ignorare questa possibilità, ma IMO ne vale la pena, perché spiega gli avvertimenti divertenti che i buoni compilatori ti danno quando mischi i puntatori a char e unsigned char.

+0

Un array deve avere un valore costante tra [] e non usare variabili o funzioni. Regole C++. –

+2

Principalmente vero, ma 'sizeof' non è una funzione e' sizeof (greeting) 'è un'espressione costante intera. Puoi "usare le variabili" nelle espressioni della costante intera in certi modi, e questo è uno di questi, poiché il valore di "saluto" non è usato, solo il tipo, che è "const char [12]". –

+0

'strlen (greeting)' non sarebbe permesso in C++, per la ragione che dici. –

Problemi correlati