2013-03-04 6 views
0

donc donné:sortie char * à std :: string C++

struct MemoryStruct { 
    char *memory; 
    size_t size; 
}; 

char* memory détient un retour boucle, doc XML.

que je fais:

if(chunk.memory) { 
    std::cout << "char size is " << sizeof(chunk.memory) << std::endl; 
    std::string s = ""; 
    for (int c = 0; c<sizeof(chunk.memory); c++) { 
     s.push_back(chunk.memory[c]); 
    } 
    std::cout << "s: " << s.c_str() << std::endl; 
} 

Je ne reçois retour <?xm

Alors sizeof() je pense est de retour le total des octets dans le char *

Comment puis-je obtenir la valeur réelle est un char*. Donc, fondamentalement, le retour de la boucle entière. Quelle est 5 lignes de XML?

+2

'sizeof' sur un' char * 'retourne la taille du pointeur, pas le nombre de caractères dans la chaîne. Utilisez 'strlen (chunk.memory)' pour obtenir la longueur de la chaîne (en supposant qu'elle soit terminée par un caractère nul). Et il n'y a pas besoin de 'push_back' chaque caractère individuellement,' std :: string' a un constructeur qui accepte 'char const *' pour une chaîne terminée par un caractère nul. 'std :: string s (chunk.memory);' suffira. Si ce n'est pas une terminaison nulle, utilisez 's (chunk.memory, str_length);' – Praetorian

Répondre

4

sizeof(chunk.memory) donnera toujours la taille d'un pointeur qui dans votre cas semble être 4. Voilà pourquoi vous ne voyez que 4 caractères dans votre chaîne std :: string.

Si votre retour boucle ou tout autre chose est mis fin par \0, vous pouvez directement effectuer les opérations suivantes

std::string s(chunk.memory); 

Si votre char * ne se termine pas par \0, alors vous devez connaître la longueur de la chaîne - vous ne pouvez pas utiliser sizeof(chunk.memory) pour cela. Si votre chunk.size contient la bonne taille, vous pouvez utiliser

std::string s(chunk.memory, chunk.size); 
+1

vous pourriez suggérer 'strlen (chunk.memory)'? – hannes

+0

En outre, si 'MemoryStruct' est créé par son code, il pourrait simplement utiliser un' std :: string' là en premier lieu. –

+0

En fait, vous ne voulez probablement pas utiliser strlen car l'analyseur xml retourne un petit fragment de mémoire qui ne sera pas terminé par un caractère nul. – doron

2

std :: string constructeur peut accepter char * et longueur des données (see the docs); Exemple:

std::string s(chunk.memory, chunk.size); 

donc conteneur pré-allouer de l'espace nécessaire pour votre chaîne et initialiser avec elle.

2

MemoryStructmemory est le pointeur sur le premier caractère renvoyé et size est le nombre de caractères renvoyés. Vous souhaitez initialiser une chaîne avec ces données afin que vous devez faire:

s.assign(chunk.memory, chunk.size);