заменить strlen с sizeof для c-строки

0

Я хочу использовать метод 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;
}

Я получаю неправильные результаты (значения не одинаковы в обоих массивах). Каков наилучший способ его решения? Я также открыт для других идей, как сделать это преобразование без использования строк, но чистых массивов

  • 1
    strlen живет в заголовке string.h . Или используйте это, или напишите свой собственный strlen .
  • 0
    К сожалению, я не могу использовать string.h. Кстати, возможно ли выполнить такое преобразование без заголовка? Просто чистый с
Показать ещё 7 комментариев
Теги:
arrays
cstring

2 ответа

3

Учитывая 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.
0

Не то, чтобы я эксперт по этому вопросу, но преобразование 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 | часть выглядит действительно устаревшей для меня, но мне хотелось включить ее, не знаю, почему...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню