Я хочу использовать метод mbstowcs_s, но без заголовка iostream. Поэтому я не могу использовать strlen для прогнозирования размера моего буфера. Следующий метод должен просто изменить c-строку на широкую c-строку и вернуть ее:
char* changeToWide(char* value)
{
wchar_t* vOut = new wchar_t[strlen(value)+1];
mbstowcs_s(NULL,vOut,strlen(val)+1,val,strlen(val));
return vOut;
}
Как только я изменю его на
char* changeToWide(char* value)
{
wchar_t* vOut = new wchar_t[sizeof(value)];
mbstowcs_s(NULL,vOut,sizeof(value),val,sizeof(value)-1);
return vOut;
}
Я получаю неправильные результаты (значения не одинаковы в обоих массивах). Каков наилучший способ его решения? Я также открыт для других идей, как сделать это преобразование без использования строк, но чистых массивов
Учитывая char * или const char *, вы не можете использовать sizeof(), чтобы получить размер строки, указываемой вашей переменной char *. В этом случае sizeof() вернет вам количество байтов, которые использует указатель в памяти (обычно 4 байта в 32-битных архитектурах и 8 байтов в 64-разрядных архитектурах).
Если у вас есть массив символов, определенных как массив, вы можете использовать sizeof:
char text[] = "test";
auto size = sizeof(text); //will return you 5 because it includes the '\0' character.
Но если у вас есть что-то вроде этого:
char text[] = "test";
const char* ptext = text;
auto size2 = sizeof(ptext); //will return you probably 4 or 8 depending on the architecture you are working on.
Не то, чтобы я эксперт по этому вопросу, но преобразование char
для wchar_t
, по-видимому, ничего, кроме использования более широкого пространства для одних и тех же байтов, другими словами, префикса каждого char
с некоторым набором нулей.
Я также не знаю C++, просто C, но я могу получить то, что, вероятно, будет выглядеть в C++, посмотрев ваш код, так что вот оно:
wchar_t * changeToWide( char* value )
{
//counts the length of the value-array including the 0
int i = 0;
while ( value[i] != '\0' ) i++;
//allocates enough much memory
wchar_t * vOut = new wchar_t[i];
//assigns values including the 0
i = 0;
while ( ( vOut[i] = 0 | value[i] ) != '\0' ) i++;
return vOut;
}
0 |
часть выглядит действительно устаревшей для меня, но мне хотелось включить ее, не знаю, почему...
strlen
живет в заголовкеstring.h
. Или используйте это, или напишите свой собственныйstrlen
.