Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562

Не получается преобразование

02.03.2014, 17:50. Показов 1131. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
std::wstring                                Utf8ToWString  (std::string   &s                )
{
 size_t        BufferSize;
 wchar_t      *Buffer;
 std::wstring  Result=L"";
 if (!s.empty())
 {
  BufferSize=MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, s.c_str(), s.capacity(), NULL, 0);
  Buffer=new wchar_t [BufferSize+1];
  if (Buffer!=NULL)
  {
   MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, s.c_str(), s.capacity(), Buffer, BufferSize);
   Buffer[BufferSize]=L'\0';
   Result=Buffer;
  }
 }
 return Result;
s хранит строку в UTF8, капасити правильная, а BufferSize нулевая.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.03.2014, 17:50
Ответы с готовыми решениями:

String в char. Не получается преобразование
Задание: 1.Получить имя как параметр командной строки(через аргументы функции main) На экране: "Привет, Имя" 2.Есть функция...

Преобразование СДНФ - получается не эквивалентная функция
Составил СДНФ по таблице истинности, преобразовал, сделал схему - и, при подаче "1" на входы А и С, или А и D, или B и С, или B и...

Не получается взять обратное преобразование Лапласа от функции
Не понимаю, в чем проблема. Пробовал также взять от t, не получается.

12
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
02.03.2014, 18:10
Buffer не может быть равен NULL - при ошибке будет исключение. Кто delete будет и почему бы сразу в Result не писать? Длина строки - size или length, а не capacity. Возвращаемый MultiByteToWideChar размер уже учитывает нулевой символ.
И в любом случае при ошибках смотри, что вернёт GetLastError().
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
02.03.2014, 18:13
Лучший ответ Сообщение было отмечено taras atavin как решение

Решение

tarasproger, почти все правильно, кроме использования capacity, проверки на NULL результата new и отсутствия освобождения памяти.
Вот я подправил, все работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <string>
#include <windows.h>
 
std::wstring Utf8ToWString(std::string const & s)
{
    std::wstring result;
    if(!s.empty())
    {
        int length = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.size(), 0, 0);
        wchar_t * out = new wchar_t[length];
        MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.size(), out, length);
        result.assign(out, length);
        delete [] out;
    }
    return result;
}
 
int main()
{
    setlocale(LC_ALL, "");
 
    std::string s = "привет мир!";
 
    std::wcout << L"[" << Utf8ToWString(s) << L"]\n";
}
Ну и проверку length на ноль неплохо бы еще добавить.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
02.03.2014, 18:15  [ТС]
Цитата Сообщение от Somebody Посмотреть сообщение
Buffer не может быть равен NULL - при ошибке будет исключение.
Когда он NULL, я ещё не знаю, какого размера мне нужен будет буфер, соответственно не могу его выделить и он не может не быть NULL, второй же раз он не равен NULL.
Цитата Сообщение от Somebody Посмотреть сообщение
и почему бы сразу в Result не писать?
Потому что Result имеет тип std::wstring, а писать надо в wcahr_t*.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
02.03.2014, 18:19
tarasproger, Он говорит о том, что new НЕ возвращает ноль, если память выделить не удалось. new бросает исключение std::bad_alloc.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
02.03.2014, 18:24
Цитата Сообщение от tarasproger Посмотреть сообщение
Потому что Result имеет тип std::wstring, а писать надо в wcahr_t*.
C++
1
2
result.reserve(length);
MultiByteToWideChar(..., &result[0], ...);
?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
02.03.2014, 18:25
Somebody, такое легально только в С++11.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.03.2014, 18:33
Такое легально даже в Си.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
02.03.2014, 18:36
castaway, в С++03 не было ни гарантии на какую-то конкретную внутреннюю реализацию, ни на то, что строка будет храниться непрерывно. Например в случае COW-строки мы таким образом можем запросто нарушить инвариант. В С++11 появились гарантии и требования к реализации, которые позволяют обезопасить данный способ от побочных эффектов.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
02.03.2014, 18:37  [ТС]
Конкретное внутреннее представление строки стандартом не гарантировано, так что это не допускается даже в c++. А вот оператор присваивания нуль-терминальной строки wstring-строке гарантировано перегружен с учётом всех особенностей внутреннего представления.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.03.2014, 18:42
Я отвечал на 7-й пост. Наверное мы друг друга не поняли.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
02.03.2014, 18:42
Да, точно, только в C++11.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
02.03.2014, 18:44
Вот вам из стандарта С++11 (21.4.1/5):
The char-like objects in a basic_string object shall be stored contiguously. That is, for any basic_string
object s, the identity &*(s.begin() + n) == &*s.begin() + n shall hold for all values of n such that 0 <= n < s.size().
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.03.2014, 18:44
Помогаю со студенческими работами здесь

Символическое дифференцирование-ввод формулы в связный список, преобразование в ПОЛИЗ, обратное преобразование
Прошу помогите мне. Символическое дифференцирование-ввод формулы в связный список, преобразование в ПОЛИЗ, обратное преобразование в...

Преобразование звукового сигнала в спектр (Фурье-преобразование)
Доброго времени суток! Мне необходимо преобразовать звуковой файл в спектр, а как и с чего начать я не понимаю

Преобразование изображения по гистограмме. Гиперболическое преобразование гистограммы
Добрый день уважаемые пользователи. При изучении путей обработки и фильтрации изображений в Матлабе столкнулся с такой проблемой. Задание:...

Почему не получается получить и изменить ul через js по id? А что выше id получается
все данные классы находятся в меню шапке 1 работает а 2 нет сайт http://phpstack-189549-661864.cloudwaysapps.com/ ...

Загрузить видео вконтакте. Странно получается. Почему так получается?
Решил згрузить в контакт Мультфильм Дикая планета http://www.youtube.com/watch?v=8-nwT9YQ0t0&amp;NR=1&amp;feature=endscreen в максимально...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru