2010-02-05 5 views
12

Comment convertir une chaîne à unsigned char en C++ ...Comment convertir une chaîne littérale à un tableau non signé char dans visual C++

Je,

unsigned char m_Test[8]; 

Je veux assigner une chaîne "Hello world" à m_Test.

comment le faire?

+0

J'ai changé le titre de la question car en fait ce que vous voulez convertir est un littéral de chaîne. Une chaîne est une classe std en C++ et le titre était trompeur. J'espère que ça ne vous dérange pas. –

+0

@IvayloStrandjev le titre actuel est extrêmement trompeur. La question est "comment affecter un littéral de chaîne à un tableau char non signé" et non "comment convertir un littéral de chaîne en caractère non signé". Et même si vous aviez la direction correcte, il s'agit d'un tableau char non signé, pas un char non signé. –

+0

@Mike correct J'ai résolu que maintenant –

Répondre

17

Tout d'abord, le tableau doit être au moins assez grand pour contenir la chaîne:

unsigned char m_Test[20]; 

alors vous utilisez strcpy. Vous devez lancer le premier paramètre pour éviter un avertissement:

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

Ou si vous voulez être un C++ puriste:

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

Si vous voulez initialiser la chaîne plutôt que l'affecter, vous pourriez dire aussi:

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

Peut-être vaut la peine de mentionner que vous pouvez laisser tomber la taille dans le dernier exemple, puisque le compilateur le comprendra. –

1

vous pouvez utiliser la fonction strcpy Mais gardez à l'esprit que m_Test est seulement 8 taille et il y aura un débordement. Strcpy ne vérifie pas que et vous obtiendrez une exception

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

pourrait utiliser strncpy ...? – Goz

+0

Mais il ne copiera pas toute la chaîne de toute façon. Je crois que le but principal est de copier toute la chaîne. – anthares

+0

"vous obtiendrez une exception" - si vous êtes chanceux. –

1

Vous pouvez utiliser la fonction c_str() de std::string pour obtenir le char* de chaîne. Cette méthode retourne fondamentalement un pointeur vers une chaîne de style c. Après cela, vous pouvez utiliser les fonctions normales de copie de chaîne telles que strcpy ou strncpy pour copier la valeur dans test.

1

Vous pouvez utiliser strcpy:

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

Notez que « Bonjour tout le monde » est trop long pour 8 octets, de sorte que vous obtiendrez probablement une erreur de segmentation.

2

Vous pouvez utiliser une fonction de copie de chaîne comme strcpy ou mieux encore strncpy, qui a aussi des contrôles de taille:

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

VOICI Wikipédia sur strncpy:

3

Pour toutes fins pratiques, les réponses strcpy sont correctes, avec la note que 8 n'est pas assez grand pour votre chaîne.

Si vous voulez être vraiment pédant, vous pourriez avoir besoin quelque chose comme ceci:

#include <algorithm> 

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

La raison en est que std :: copie convertir les caractères dans la chaîne d'origine à unsigned char. strcpy résultera en les caractères dans la chaîne d'origine étant réinterprété comme unsigned char. Vous ne dites pas lequel vous voulez.

Le standard permet d'avoir une différence entre les deux, bien que ce soit très rare: il faudrait signer char, dans une implémentation avec une représentation de complément 1s ou de grandeur de signe. Vous pouvez à peu près ignorer la possibilité, mais il vaut la peine de le savoir, car cela explique les avertissements drôles que les bons compilateurs vous donnent lorsque vous mélangez des pointeurs vers char et unsigned char.

+0

Un tableau doit avoir une valeur constante entre [] et ne pas utiliser de variables ou de fonctions. Règles C++ –

+2

Principalement vrai, mais 'sizeof' n'est pas une fonction, et' sizeof (salutation) 'est une expression constante entière. Vous pouvez "utiliser des variables" dans des expressions de constantes entières de certaines façons, et c'est l'une d'elles, puisque la valeur de 'greeting' n'est pas utilisée, seulement le type, qui est' const char [12] '. –

+0

'strlen (salutation)' ne serait pas autorisé en C++, pour la raison que vous dites. –

Questions connexes