Надо скопировать из char массива в wchar_t массив. Поэтому даже специальная функция для wchar_t wmemcpy не будет работать.
Надо попробовать побитовые операции использовать.
Но я я знаю как побитовыми операциями копировать биты. Как в ноль установить знаю, как инвертировать или в единицу установить, но не как копировать.
C/C++
Копирование бит из массива в массив не используя memcpy. (Си)
могу ошибаться, но memcpy глубоко фиолетово, что во что копировать. единственная проблема с ней - указать правильное количество байтов.
или требуется не просто побайтное копирование, а преобразование типов?
или требуется не просто побайтное копирование, а преобразование типов?
Если у вас A[] char массива в B[] wchar_t массив
wchar_t C[255] - заведите себе массив такой и занесите все символы в нужной кодировке.
Потом B[i] = C[ A[i] ] в цикле для каждого i-того и сделаете
wchar_t C[255] - заведите себе массив такой и занесите все символы в нужной кодировке.
Потом B[i] = C[ A[i] ] в цикле для каждого i-того и сделаете
Рафкат Нигматуллин
char==1 Байт
wchar_t==2 Байта
Мне надо в wchar_t 2 Байта массива char положить по порядку
wchar_t==2 Байта
Мне надо в wchar_t 2 Байта массива char положить по порядку
Рафкат Нигматуллин
wchar_t[0]=char[0]
Рафкат Нигматуллин
wchar_t[1]=char[0]
Рафкат Нигматуллин
Я с кодированием и перекодированием уже разобрался. Мне надо просто теперь результат работы положить в массив wchar_t
Рафкат Нигматуллин
У меня есть два Байта.
0001 0000
0011 0000
Их надо сохранить в переменную wchar_t
0001 0000
0011 0000
Их надо сохранить в переменную wchar_t
Рафкат Нигматуллин
Я точно разобрался.
Максик ...
> Я с кодированием и перекодированием уже разобрался. Мне надо просто теперь результат работы положить в массив wchar_t
Нихрена вы не разобрались, судя по этому комментарию
Нихрена вы не разобрались, судя по этому комментарию
Рафкат Нигматуллин
Если получится сохранить, скину код
Рафкат Нигматуллин
По вашему комментарию и правда сказать нечего.
Рафкат Нигматуллин
https://onlinegdb.com/xxUQabcCN
Но этот код надо ещё переделывать потому что я не учёл что между кириллицей могут быть латинские символы.
Онлайн компилятор кириллицу латиницей печатает если что.
Но этот код надо ещё переделывать потому что я не учёл что между кириллицей могут быть латинские символы.
Онлайн компилятор кириллицу латиницей печатает если что.
Рафкат Нигматуллин
>>правильно. Зачем лепить горбатого? Просто из одного массива посимвольно переносишь в другой
Зачем так если можно мапример кучу места с экономить?
Зачем так если можно мапример кучу места с экономить?
Рафкат Нигматуллин
Хотя не экономится место ведь))
Но можте пригодится)
Но можте пригодится)
Скопировать можно через memcpy. Никаких волшебных данных, с которыми бы она не справилась, не существует, но после копирования результат в строку из длинных символов, естественно, не превратится.
По сути вопроса - требуется не копирование, а преобразование строки, для этого, естественно, есть специальные функции типа mbstowcs или более низкоуровневые RtlAnsiStringToUnicodeString
По сути вопроса - требуется не копирование, а преобразование строки, для этого, естественно, есть специальные функции типа mbstowcs или более низкоуровневые RtlAnsiStringToUnicodeString
Это разные типы данных.
Нельзя копированием байт данных превратить один тип данных в другой.
Обычно для этого используют специальные программы (конструкторы и операторы).
эти программы и совершают все необходимые операции с данными.
например простое выражение в c++ " a = b " означает что у переменной a нужно определить ее тип у этого типа нужно найти программу оператора присваивания и вызвать эту программу с параметром b.
memcpy просто копирует данные в памяти не вызывая никаких специальных программ работающих с данными.
Нельзя копированием байт данных превратить один тип данных в другой.
Обычно для этого используют специальные программы (конструкторы и операторы).
эти программы и совершают все необходимые операции с данными.
например простое выражение в c++ " a = b " означает что у переменной a нужно определить ее тип у этого типа нужно найти программу оператора присваивания и вызвать эту программу с параметром b.
memcpy просто копирует данные в памяти не вызывая никаких специальных программ работающих с данными.
Рафкат Нигматуллин
Я тип данных менять не собираюсь. мне просто биты скопировать
Павел Старухин
memcpy с этим замечательно справиться.
но нужно понимать что биты из типа данных char прочитанные как тип данных wchar_t будут бессмысленным мусором.
но нужно понимать что биты из типа данных char прочитанные как тип данных wchar_t будут бессмысленным мусором.
Рафкат Нигматуллин
memcpy копирует ВО ВСЁ ПРОСТРАНСТВО типа wchar_t
У меня есть два Байта.
0001 0000
0011 0000
Их надо сохранить в переменную wchar_t
У меня есть два Байта.
0001 0000
0011 0000
Их надо сохранить в переменную wchar_t
Рафкат Нигматуллин
Переменная типа wchar_t имеет размер 2 Байта. Ничего я никуда ещё не копировал.
Мне в эти 2 Байта надо сохранить 2 переменные типа char
ПОЛУЧЕННЫЙ РЕЗУЛЬТАТ ЭТО УЖЕ МОЯ ГОЛОВНАЯ БОЛЬ.
Мне в эти 2 Байта надо сохранить 2 переменные типа char
ПОЛУЧЕННЫЙ РЕЗУЛЬТАТ ЭТО УЖЕ МОЯ ГОЛОВНАЯ БОЛЬ.
Рафкат Нигматуллин
Если честно, то вы пишете абсолютный БРЕД
Рафкат Нигматуллин
Поспите что ли
Рафкат Нигматуллин
Блят* это сюрреализм какой то, цирк
Ну типа такого что ли можно было бы
if(charmassiv[i]&1<<7)
{
wcharmassiw[i]&1<<7;
}
Ну типа такого что ли можно было бы
if(charmassiv[i]&1<<7)
{
wcharmassiw[i]&1<<7;
}
Павел Старухин
>> Переменная типа wchar_t имеет размер 2 Байта ...
Откуда такая уверенность? если работаешь в студии выделяешь объявление wchar_t открываешь контекстное меню и ищешь декларацию этого типа там будет что то типа #define char16_t wchar_t затем ищешь реализацию реального типа.
Откуда такая уверенность? если работаешь в студии выделяешь объявление wchar_t открываешь контекстное меню и ищешь декларацию этого типа там будет что то типа #define char16_t wchar_t затем ищешь реализацию реального типа.
Рафкат Нигматуллин
wchar_t в Windows всегда 16 бит
https://docs.microsoft.com/en-us/cpp/cpp/char-wchar-t-char16-t-char32-t?view=msvc-170
https://docs.microsoft.com/en-us/cpp/cpp/char-wchar-t-char16-t-char32-t?view=msvc-170
Рафкат Нигматуллин
Не определяемый, а определенный реализацией.
В компиляторе Microsoft он представляет собой 16-битный символ, используемый для хранения Unicode, закодированного как UTF-16LE,
В компиляторе Microsoft он представляет собой 16-битный символ, используемый для хранения Unicode, закодированного как UTF-16LE,
Рафкат Нигматуллин
>> Это к святой уверености в 2 Байта у wchar_t
А это на тему того как я разобрался в кодировках
https://onlinegdb.com/xxUQabcCN
Но этот код надо ещё переделывать потому что я не учёл что между кириллицей могут быть латинские символы.
Онлайн компилятор кириллицу латиницей печатает если что.
А это на тему того как я разобрался в кодировках
https://onlinegdb.com/xxUQabcCN
Но этот код надо ещё переделывать потому что я не учёл что между кириллицей могут быть латинские символы.
Онлайн компилятор кириллицу латиницей печатает если что.
Рафкат Нигматуллин
**И решение заданного здесь вопроса, на который хз выделывались все как могли.
Да здорово, вооружиться всеми достоинствами сишного языка и дома посидеть перебирая биты) wchar_t не особо востребованный тип, так как энглишь и русишь влезают в тип char)
Александр Ершев
Все, понял почему мой ответ не лидер! Копируй побайтово, в цикле с условием что x%1 не верно)
Похожие вопросы
- Помогите добавить ввод чисел в массив матрицы на языке Си
- Можно ли через функцию memset записать число в элемент массива больше чем 255? (Си)
- Почему вместо двумерного массива мы используем двойной указатеть?
- Имя массива после инициализации принимает адрес в стеке, который указывает на адрес в куче? (Си)
- Одномерные массивы на языке си
- Измерение времени на си. Почему-то скорость сортировки массива выводится со второго раза.. И еще надо измерить память
- Как обработать этот массив на языке Си?
- Как узнать количество символов в UTF8 массиве?(Си)
- Задачка по СИ на вставку элемента в динамический массив.
- Упорядочить элементы массива по возрастанию на языке Си
wchar_t==2 Байта
Мне надо в wchar_t 2 Байта массива char положить по порядку
Во вторых memcpy может скопировать только из одного типа в другой, не побитово, а полностью из одного в другой. Если это возможно
У меня есть два Байта.
0001 0000
0011 0000
Их надо сохранить в переменную wchar_t по порядку
Мне надо 2 байта char сохранить в двух Байтах wchar_t
Вот например так
int main()
{
char charvariable1='a';
char charvariable2='b';
wchar_t wcharvariable = 0;
mbstowcs(&wcharvariable, &charvariable1,8);
mbstowcs(&wcharvariable, &charvariable2,8);
printf("%c\n", wcharvariable);
}
В переменную wcharvariable ПЕРЕЗАПИШЕТСЯ char charvariable2='b';
В переменной wcharvariable будет не 2 переменных по порядку, а перезапишется последняя переменная.
Может есть другой способ
{
char charvariable1='a';
char charvariable2='b';
wchar_t wcharvariable = 0;
mbstowcs(&wcharvariable, &charvariable1,8);
mbstowcs(&wcharvariable, &charvariable2,8);
printf("%c\n", wcharvariable);
for(int i=15;i>=0;i--)
{
if(wcharvariable&1<<i)
{
printf("%d", 1);
}
else{printf("%d", 0);}
}
printf("\n");
}
У меня есть два Байта.
0001 0000
0011 0000
Их надо сохранить в ОДНУ переменную wchar_t по порядку
Но этот код надо ещё переделывать потому что я не учёл что между кириллицей могут быть латинские символы.
Онлайн компилятор кириллицу латиницей печатает если что.
https://rextester.com/WVPEH45723
Да, это то что надо.
Видимо только не в языке Си?
https://onlinegdb.com/IMUytqQE5
При utf8 кодировке кракозябры только.
Побитово трансформировать надёженее будет.
Когда кодировка 1251 в в IDE, то функция mbstowcs сохраняет ДВА char элемента массива, в ОДИН wchar_t элемент массива.
У меня такая дичь только в настройки Code Blocks вставляется.
А в других компиляторах куда?
вот тут:
https://stackoverflow.com/questions/33208733/how-to-add-compiler-flags-on-codeblocks
говорят, где-то в Project > Build Options > Compiler Flags
Не понимаю чем это поможет.
Я кодировку сменил уже