La conversion de std::wsting char* avec wcstombs_s
J'ai chaînes de caractères qui contiennent uniquement des chiffres (juste la plaine Latin, de 0 à 9, par exemple "0123"), stockés comme std::wstring, et j'ai besoin de chacun d'eux comme un char*. Quelle est la meilleure façon pour moi de faire cela? C'est ma première approche:
void type::convertWStringToCharPtr(_In_ std::wstring input, _Out_ char * outputString)
{
outputString = new char[outputSize];
size_t charsConverted = 0;
const wchar_t * inputW = input.c_str();
wcstombs_s(&charsConverted, outputString, sizeof(outputString), inputW, input.length());
}
EDIT: Le code ci-dessous fonctionne. Merci à tous!
void type::convertWStringToCharPtr(_In_ std::wstring input, _Out_ char * outputString)
{
size_t outputSize = input.length() + 1; //+1 for null terminator
outputString = new char[outputSize];
size_t charsConverted = 0;
const wchar_t * inputW = input.c_str();
wcstombs_s(&charsConverted, outputString, outputSize, inputW, input.length());
}
- sizeof(outputstring) ne pas faire ce que tu pense que c'est le cas, il vous indique comment big le pointeur est
- Merci, j'ai mis à jour le code. Je pensais que wcstombs_s voulait la taille d'un pointeur pour une raison quelconque.
- Et il ne fonctionne toujours pas?
- Il est maintenant. J'ai mis à jour le post avec le code de travail. Merci!!!!
- Veuillez veuillez veuillez utiliser
unique_ptr<char[]>
plutôt que de déclarer un pointeur brut ici.
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas d'allouer suffisamment de mémoire pour votre tampon:
Devrait être
en raison de la résiliation de NUL caractères.
Oh, et aussi, par pm100's commentaire:
sizeof(outputString)
est de vous donner la taille du pointeur. Vous devez utiliserinput.length() + 1
, comme c'est la taille de la mémoire tampon.Il y a quelques erreurs dans votre code. Tout d'abord, vous n'êtes pas d'allouer assez d'espace dans votre tampon de destination pour le caractère NULL. Vous devez allouer au moins
input.length() + 1
caractères pour la fonction de réussir.Deuxième, vous n'êtes pas de passage dans la bonne taille de la mémoire tampon de sortie de la fonction.
sizeof(outputString)
retourne la taille deoutputString
lui-même, unchar *
, et non pas le nombre d'octets indiqué par le pointeur.De sorte que votre fonction devrait ressembler à ceci:
En C++, je n'aurais jamais utiliser pur pointeurs: utilisation
vector
si un char tableau nécessaires dans le tas! Voulez-vous copier la chaîne source? Si non, const de référence doit être utilisé pourinput
.wcstombs_s
est utilisé uniquement dans Windows, alors pourquoi ne pas utiliser simplementWideCharToMultiByte
? A été la conversion de la réussite? Valeur de retour.Utilisation d'un vecteur externe C++ lib:
wstring
et utiliser C chaîne de style comme une cible. Étrange. Pauvres de vous! 🙂