2013-07-19 34 views
21

Jestem trochę ubogi w odlewanie. Mam ciąg znaków w xmlChar* (który jest bez znaku char *), Chcę przekonwertować ten unsigned char na typ std::string.konwertuj niepodpisany znak * na ciąg

xmlChar* name = "Some data"; 

Starałem się jak najlepiej, aby pisać, ale nie mogłem tego przekonwertować.

+1

'lub' String std :: string'? Co to jest 'String', jeśli nie masz na myśli' std :: string'? –

+0

Niestety @Mats Petersson, BTW jego std :: string – Cyril

+0

Zastosowanie reinterpret_cast Zobacz ten [http://stackoverflow.com/questions/658913/c-style-cast-from-unsigned-char-to-const- char] [1] [1]: http://stackoverflow.com/questions/658913/c-style-cast-from-unsigned-char-to-const-char – Ani

Odpowiedz

36
std::string sName(reinterpret_cast<char*>(name)); 

reinterpret_cast<char*>(name) rzuca od unsigned char* do char* w niebezpieczny sposób, ale to jest ten, który powinien być stosowany tutaj. Następnie wywołujesz zwykłego konstruktora z std::string.

Można również zrobić to w stylu C (nie zalecane):

std::string sName((char*) name); 
+0

Odkryłem, że w niektórych przypadkach reinterpretowanie rzuca na końcu pewną ilość niepotrzebnych znaków. Nie badałem zbyt głęboko, ponieważ łatwo było je uciąć, ale pomyślałem, że wspomnę o tym na wypadek, gdy nie jestem sam. – MatrixManAtYrService

+0

Nie sam, zdarzyło się też ze mną – audiFanatic

+0

Prawdopodobnie widzisz śmieci, ponieważ twój unsigned char tablica nie kończy się z terminatorem o wartości NULL (lub nie kończy się na tym, w którym myślisz, że to robi). Ogólnie rzecz biorąc, po prostu rzutowanie z typu na typ łańcucha bez uwzględnienia NUL jest niebezpieczne i powinieneś pomyśleć o tym ostrożnie, jeśli twój kod jest w jakikolwiek inny sposób niż przykład OP (ciąg ** ** literały mają już terminatory zerowe) –