¿Por qué es el siguiente código C ++ imprimiendo sólo el primer carácter?

StackOverflow https://stackoverflow.com/questions/4492402

  •  12-10-2019
  •  | 
  •  

Pregunta

Estoy tratando de convertir una cadena char a una cadena wchar.

Con más detalle: Estoy tratando de convertir un char [] a un wchar [] y luego append "1" a esta cadena y la impresión de que

.
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;

Pero simplemente imprime c

¿Es este el camino correcto para convertir de char a wchar? He llegado a conocer de otra manera desde entonces. Pero me gustaría saber por qué el código anterior funciona de la manera que lo hace?

¿Fue útil?

Solución

mbtowc conversos sólo un único carácter. ¿Se refiere a usar mbstowcs ?

Normalmente se llama a esta función dos veces; la primera para obtener el tamaño de almacenamiento intermedio necesario, y el segundo para realmente convertirlo:

#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 en lugar de utilizar mbstowcs_s (debido a las advertencias de desaprobación), a continuación, hacer esto:

#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;

Asegúrese de tomar el cuidado de los problemas de localización a través de setlocale () o el uso de las versiones de mbstowcs() (tales como mbstowcs_l() o mbstowcs_s_l()) que toma un argumento locale.

Otros consejos

¿Por qué utiliza el código C, y por qué no lo escribe de una forma más portátil, por ejemplo, lo que haría aquí es utilizar la STL!

std::string  src = std::string("C:\\user") +
                   std::string(" 1");
std::wstring dne = std::wstring(src.begin(), src.end());

wcout << dne;

es tan simple que es fácil: D

L "Hello World"

el prefijo L delante de la cadena hace que sea una cadena de carbón de ancho.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top