Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

WCHAR to char

23K
08 января 2013 года
1_2
34 / / 09.01.2012
Доброго времени суток! Помогите, пожалуйста, преобразовать WCHAR в char. В сети я нашёл только примеры по преобразованию wchar_t в char.
11K
08 января 2013 года
xAtom
65 / / 17.01.2011
Код:
#include <stdio.h>


int main(void)
{
   const wchar_t* str = L"Hello Codenet !!!";
   
   char buf[32];
   size_t len = wcstombs(buf, str, wcslen(str));
   if(len > 0u)
         buf[len] = '\0';

   puts(buf);
   return 0;
}
TEST CONVERT wchar to char
414
08 января 2013 года
CassandraDied
763 / / 24.05.2012
wchar_t и WCHAR - это одно и то же, если платформа - Windows.
23K
08 января 2013 года
1_2
34 / / 09.01.2012
Но для функции DosToApiPath нужно WCHAR, а если wchar_t, то выдаёт ошибку...
414
08 января 2013 года
CassandraDied
763 / / 24.05.2012
Ты попросил преобразовать помочь, а не вызвать функцию. Давай прототип функции и тип переменной, которую хочешь передать.
7
08 января 2013 года
@pixo $oft
3.4K / / 20.09.2006
Где ты функцию такую нашёл? MSDN о такой не знает
И вообще, это очень странно, что выдаёт ошибку, ибо WCHAR определяется через wchar_t. Это же один и тот же тип, по сути

P.S. Только что понял, что ссылка немного не та, но всё равно. Глянь объявление WCHAR (F12 тебе в помощь)
А вот и правильная ссылка
23K
08 января 2013 года
1_2
34 / / 09.01.2012
Эта ф-ия используется в программе, которая выводит список открытых файлов и принадлежность их к определённому процессу
7
08 января 2013 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: 1_2
Эта ф-ия используется в программе, которая выводит список открытых файлов и принадлежность их к определённому процессу

И сразу всё понятно
Нет бы написать, что эта функция самописная, и дать ссылку на источник. Ну а про типы тебе уже было написано. Быть может, твой косяк в том, что ты не замечаешь там звёздочку в прототипе функции?

23K
08 января 2013 года
1_2
34 / / 09.01.2012
Сейчас всё проверю...
23K
08 января 2013 года
1_2
34 / / 09.01.2012
Сменил WCHAR на wchar_t - всё работает. Осталось только решить вопрос с конвертацией. Или можно обойтись без неё... а бывает ли ф-ия для поиска определённой строки в строке wchar_t?
7
08 января 2013 года
@pixo $oft
3.4K / / 20.09.2006
Ах да, сразу не заметил — почему-то думал, что тебе надо WCHAR в wchar_t преобразовать. Думаю, что за фигня :)
WideCharToMultiByte
23K
08 января 2013 года
1_2
34 / / 09.01.2012
Вот ф-ия конвертации:

Код:
char * unicode_to_1251(wchar_t *unicode_string)
{
    int err;
    char * res;
    int res_len = WideCharToMultiByte(
        1251,               // Code page
        0,                  // Default replacement of illegal chars
        unicode_string,     // Multibyte characters string
        -1,                 // Number of unicode chars is not known
        NULL,               // No buffer yet, allocate it later
        0,                  // No buffer
        NULL,               // Use system default
        NULL                // We are not interested whether the default char was used
        );
    if (res_len == 0)
    {
        printf("Failed to obtain required cp1251 string length\n");
        return NULL;
    }
    res = calloc(sizeof(char), res_len);
    if (res == NULL)
    {
        printf("Failed to allocate cp1251 string\n");
        return NULL;
    }
    err = WideCharToMultiByte(
        1251,               // Code page
        0,                  // Default replacement of illegal chars
        unicode_string,     // Multibyte characters string
        -1,                 // Number of unicode chars is not known
        res,                // Output buffer
        res_len,            // buffer size
        NULL,               // Use system default
        NULL                // We are not interested whether the default char was used
        );
    if (err == 0)
    {
        printf("Failed to convert from unicode\n");
        free(res);
        return NULL;
    }
    return res;
}
Но где res = calloc(sizeof(char), res_len); пишет: error C2440: =: невозможно преобразовать 'void *' в 'char *'
Для преобразования 'void*' к указателю на тип, не являющемуся 'void', требуется явное приведение.

А если убрать эту строчку, то Нарушение прав доступа...

И как здесь исправить?
23K
08 января 2013 года
1_2
34 / / 09.01.2012
СПАСИБО!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог