2011-01-25 4 views
2

J'ai un tableau de caractères (char * pData) en C++, ce que je veux faire est de copier des données (de pData) dans std :: string. Le code ressemble à ceci:char * to std :: string

std::string sSomeData(pData+8);//I want to copy all data starting from index 8 till end 

Le problème est que lorsque l'instruction ci-dessus s'exécute, la chaîne ne contient rien. Je suppose que mon pData n'est pas terminé avec '\ 0' c'est pourquoi cela ne fonctionne pas.

Cordialement, Jame.

+3

Vous devinez? Vous ne savez pas avec quelles données vous travaillez? Dans tous les cas, le code doit fonctionner avec une chaîne null-terminée correcte (en supposant qu'il a au moins 8 caractères, que vous devez absolument vérifier.) – EboMike

Répondre

6

Si vous connaissez la taille de la pData, vous pouvez utiliser la construction-de-itérateurs constructeur:

std::string sSomeData(pData + 8, pData + size_of_pData); 
+0

notez l'utilisation de pData + size_of_pData provoque la copie dépasse la limite valide. vous avez besoin de moins le décalage de départ pour résoudre ce problème. – YeenFei

+4

@YeenFei: le constructeur 'std :: string (début de l'itérateur, fin de l'itérateur)' copie les caractères * à l'exclusion * du caractère référencé par l'itérateur 'fin'. Passer un pointeur de 1-passé-le-dernier caractère est correct. – pmdj

+0

@pmjordan, je l'interprétais comme size-of-pData (longueur du pointeur de chaîne par pData) au lieu de sizeof (pData) ... – YeenFei

1

Utilisez std::string sSomeData(pData+8, pData+8+n) où n est le nombre de caractères que vous souhaitez copier.

+0

' pData + 8 + n' se référera à une adresse illégale. (Vous vouliez dire 'pData + n', mais cela a déjà été expliqué par Victor.) – sbi

+0

@sbi: en fait, il a dit que n est le nombre de caractères que vous voulez copier, ce qui serait ici (taille - 8) ;-) –

+1

@Victor & @Oswald: Désolé pour ce brainfart. – sbi

2

Si vous ne savez pas si vos données sont terminées par NULL ou non, vous devez connaître la taille des données (c'est-à-dire le nombre de caractères présents). Sinon, il n'y a aucun moyen de le copier. Lorsque vous connaissez la taille, vous pouvez le spécifier dans le constructeur de la chaîne. Voici un exemple de code:

int main(void) 
{ 
    char p[] = {'N','a','v','e','e','n'}; 
    std::string s(p+3, p+6); 
    return 0; 
} 
+0

Puis-je utiliser l'opérateur sizeof (pData) pour calculer la taille? –

+1

Non (pas en général de toute façon). Vous devez connaître la taille de manière explicite. – Naveen

+1

@JStephan: Vous pouvez utiliser 'strlen (pData)' pour calculer la longueur de la chaîne, * si * il a une terminaison nulle. Mais vous pouvez aussi utiliser l'autre variante de la solution. –

Questions connexes