Pourquoi l'impression code suivant ++ C seul le premier caractère?
Question
Je suis en train de convertir une chaîne char à une chaîne de wchar.
En plus de détails: Je suis en train de convertir un char [] à un wchar [] d'abord, puis append « 1 » à cette chaîne et l'imprimer
.char src[256] = "c:\\user";
wchar_t temp_src[256];
mbtowc(temp_src, src, 256);
wchar_t path[256];
StringCbPrintf(path, 256, _T("%s 1"), temp_src);
wcout << path;
Mais il imprime juste c
Est-ce la bonne façon de convertir char en wchar? Je suis venu à connaître une autre façon depuis. Mais je voudrais savoir pourquoi le code ci-dessus fonctionne comme il le fait?
La solution
mbtowc
convertit un seul caractère. Vouliez-vous dire utiliser mbstowcs
?
En général, vous appelez cette fonction deux fois; le premier pour obtenir la taille de la mémoire tampon nécessaire, et la seconde pour convertir réellement:
#include <cstdlib> // for mbstowcs
const char* mbs = "c:\\user";
size_t requiredSize = ::mbstowcs(NULL, mbs, 0);
wchar_t* wcs = new wchar_t[requiredSize + 1];
if(::mbstowcs(wcs, mbs, requiredSize + 1) != (size_t)(-1))
{
// Do what's needed with the wcs string
}
delete[] wcs;
Si vous utilisez plutôt mbstowcs_s
(à cause des avertissements de désapprobation), faites ceci:
#include <cstdlib> // also for mbstowcs_s
const char* mbs = "c:\\user";
size_t requiredSize = 0;
::mbstowcs_s(&requiredSize, NULL, 0, mbs, 0);
wchar_t* wcs = new wchar_t[requiredSize + 1];
::mbstowcs_s(&requiredSize, wcs, requiredSize + 1, mbs, requiredSize);
if(requiredSize != 0)
{
// Do what's needed with the wcs string
}
delete[] wcs;
Assurez-vous que vous prenez soin de problèmes régionaux par setlocale () ou en utilisant les versions de mbstowcs()
(tels que mbstowcs_l()
ou mbstowcs_s_l()
) qui prend un argument de localisation.
Autres conseils
pourquoi vous utilisez le code C, et pourquoi ne pas écrire d'une manière plus portable, par exemple ce que je ferais ici est d'utiliser la STL!
std::string src = std::string("C:\\user") +
std::string(" 1");
std::wstring dne = std::wstring(src.begin(), src.end());
wcout << dne;
il est si simple qu'il est facile: D
L "Bonjour tout le monde"
le préfixe L en face de la chaîne fait une grande chaîne char.