Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строковые Типы даных, LPCWSTR и wchar_t* 
V
    Опции темы
NOCaut
Дата 8.5.2011, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



Кокой тип даних вибрать для простоти  работи со строками? на вход в клас приходит масив юникодних символов typedef  wchar_t MasOfWChar[255]; Послее обработки строки нужно поревнять ету строку с таким типом LPCWSTR, така как мене пояснили что ети типи одинакови. Сейчас работаю wchar_t* но немогу найти никаких функция для работи. Спаасибо.
PM MAIL   Вверх
volatile
Дата 8.5.2011, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Если работаете в винапи, то лучше использовать ее типы.
Можете посмотреть, в апишных заголовочных файлах, как они определены.
например,
typedef CONST WCHAR *LPCWSTR;
typedef wchar_t WCHAR;

из этого видим что LPCWSTR идентичен const wchar_t*



Это сообщение отредактировал(а) volatile - 8.5.2011, 11:56
PM MAIL   Вверх
NOCaut
Дата 8.5.2011, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



спасибо, ето понял но с етип типом невозможно нормально работать.
я не рабою в чистом апи! Я ком обєкт пишу. мне конвертацию нада сделать один раз на виходе. а до етово както удобно роаботать со строкою

мне нада:
 - получить сколько елементов в моем масиве (размер)
 - уделить подстроку
 - uppercase
и так дале... Скажите во что можно превратить мой масив символов чтоб легко можно било с ним работать и потом конвертнуть в LPCWSTR Спасибо!

Это сообщение отредактировал(а) NOCaut - 8.5.2011, 12:23
PM MAIL   Вверх
volatile
Дата 8.5.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(NOCaut @  8.5.2011,  12:20 Найти цитируемый пост)
мне нада:
 - получить сколько елементов в моем масиве (размер)
 - уделить подстроку
 - uppercase


В вашем массиве 255 элементов, по определению.  smile 
Цитата(NOCaut @  8.5.2011,  10:30 Найти цитируемый пост)
wchar_t MasOfWChar[255]; 

если же вы хотите получить длину строки, которая там хранится, то просто wcslen(name);
Уделить строку - не понял.
uppercase, лучше юзать виндовую, так она работает правильно и с национальными символами.
CharUpper(name);
Приведите ваш код, так как не очень понятно, где у вас проблемы.


PM MAIL   Вверх
NOCaut
Дата 8.5.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



Прблема № 1 

Код

    oi[0] = (wchar_t)'r';
    oi[1] = (wchar_t)'o';
    oi[2] = (wchar_t)'m';
    oi[3] = (wchar_t)'a';
    oi[4] = (wchar_t)'$';  
    int k = wcslen(oi);
k = 264 вместо 5
ище остальние символи в масиве  - мусор. Ето можно исправить както? например переконвертировав в wide string повторюся с ним мне кажится билоб проще.


Прблема № 2

 Как строке присвоють число и наоборот. Етого вообще неполучается 3 часа просидел (inttostr strtoint) в паскале

Прблема № 3
 Как число вивести в MessageBox? тоже нигде найти немогу.


Прблема № 4
 Как привести юникодную строку к нижнему регистру. CharUpper - неюникодная насколько я понимаю
нашол towlower - но она кажись для символов

Добавлено через 4 минуты и 49 секунд
Фиксированая длинна нужна как дание передаются через FileMapping 

Это сообщение отредактировал(а) NOCaut - 8.5.2011, 14:05
PM MAIL   Вверх
volatile
Дата 8.5.2011, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



1.
Цитата(NOCaut @  8.5.2011,  14:02 Найти цитируемый пост)
    oi[0] = (wchar_t)'r';
    oi[1] = (wchar_t)'o';
    oi[2] = (wchar_t)'m';
    oi[3] = (wchar_t)'a';
    oi[4] = (wchar_t)'$';  
    int k = wcslen(oi);
k = 264 вместо 5

В С/С++ строки заканчиваются нулями.
    oi[5] = 0;

2.
Цитата(NOCaut @  8.5.2011,  14:02 Найти цитируемый пост)
Как строке присвоють число и наоборот. Етого вообще неполучается 3 часа просидел (inttostr strtoint) в паскале

wcstol, и куча подобных.
обратное преобразование _ltow, и куча подобных. (я лично предпочитаю в таких случаях swprintf в строку).

3.
Цитата(NOCaut @  8.5.2011,  14:02 Найти цитируемый пост)
Как число вивести в MessageBox? тоже нигде найти немогу.

Ну хотябы преобразовать в строку, и вывести как строку.

4.
Цитата(NOCaut @  8.5.2011,  14:02 Найти цитируемый пост)
Как привести юникодную строку к нижнему регистру. CharUpper - неюникодная насколько я понимаю

В юникодном проекте она юникодная. 
в неюникодном проекте можно юзать CharUpperW
(хотя почему у вас проект не юникодный ?!?)

PM MAIL   Вверх
NOCaut
Дата 8.5.2011, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



Цитата

В С/С++ строки заканчиваются нулями.
    oi[5] = 0;

Ето конешно класно, но я заведома незнаю что прийдет в етой строке? мне бежать каждий раз циклом по строке?
ознака конца я ввел свой знак "$" чтоб отлечить строку от мусора что идет дале


Как проект может бить юникодним

Цитата

(хотя почему у вас проект не юникодный ?!?)

Как может бить он юникодним или не юникодним? И кто Вас сказал что он НЕ юникодний?
PM MAIL   Вверх
volatile
Дата 8.5.2011, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(NOCaut @  8.5.2011,  18:08 Найти цитируемый пост)
Ето конешно класно, но я заведома незнаю что прийдет в етой строке?

а кто знает? обращайтесь к тому кто эту строку создал.
по традиции С/С++ она должна заканчиваться нулем. Если ее не писал паскакальщик конечно. smile 

Цитата(NOCaut @  8.5.2011,  18:08 Найти цитируемый пост)
Как может бить он юникодним или не юникодним

это свойство проекта, читайте документацию.

Цитата(NOCaut @  8.5.2011,  18:08 Найти цитируемый пост)
И кто Вас сказал что он НЕ юникодний? 

вы сами сказали
Цитата(NOCaut @  8.5.2011,  14:02 Найти цитируемый пост)
CharUpper - неюникодная


у вас, имхо, с падежами еще кроме-того немного проблемы
PM MAIL   Вверх
volatile
Дата 8.5.2011, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



да, хотел еще сказать, но забыл
Цитата(NOCaut @  8.5.2011,  14:02 Найти цитируемый пост)
 oi[0] = (wchar_t)'r';
зачем такой уродливый каст?
Код

oi[0] = L'r';


Это сообщение отредактировал(а) volatile - 8.5.2011, 18:59
PM MAIL   Вверх
NOCaut
Дата 8.5.2011, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



Цитата

вы сами сказали
Цитата(NOCaut @  8.5.2011,  14:02 )
CharUpper - неюникодная



Ето бил вопрос? иУ меня тут все юникодноє!!!

Строка передается с паскаля. $ - мне надо для ознаки конца. На с++  я так понял там вместо "$" нужно "0" ? 


так неполучится сделать так как я несмогу в один символ засунуть два "\0". Что делать?

Это сообщение отредактировал(а) NOCaut - 8.5.2011, 19:10
PM MAIL   Вверх
volatile
Дата 8.5.2011, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(NOCaut @  8.5.2011,  19:05 Найти цитируемый пост)
так неполучится сделать так как я несмогу в один символ засунуть два "\0". Что делать?

Вы это где, на паскале не можете сделать?
никаких двух нулей не нужно, просто один широкий символ равный нулю 0.

В конце концов, если вы можете в паскале записать $, но почему-то не можете записать 0, то можно уже в С просканировать строку, и заменить $ на 0. 
Код

wchar_t * p = wcschr( str, L'$' );
if (p) *p = 0;

PM MAIL   Вверх
NOCaut
Дата 8.5.2011, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



да спасибо, пока все понятно... Я в общем в делфи пишу восновном, просто понадобился х64 обєкт под x64 OC


Это сообщение отредактировал(а) NOCaut - 8.5.2011, 19:57
PM MAIL   Вверх
volatile
Дата 8.5.2011, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Да, более безопасный вариант, для вашего случая:
Код

wchar_t * p = wmemchr( str, L'$', 255 );
if (p) *p = 0;

PM MAIL   Вверх
NOCaut
Дата 8.5.2011, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



Как узнать размер структури в байтах
st - указатель на структуру
Код

int kk = sizeof(*st);


Размер структури несовпадает с размером структури в Delphi


Это сообщение отредактировал(а) NOCaut - 8.5.2011, 20:23
PM MAIL   Вверх
volatile
Дата 8.5.2011, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



sizeof, правильно, это размер в байтах.
А то что она не совпадает, то скорей всего дело в выравнивании.
При описании этой структуры нужно указывать правильное выравнивание.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0973 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.