Форум программистов, компьютерный форум CyberForum.ru

Как CString преобразовать к нормальной строке? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
15.01.2012, 15:02     Как CString преобразовать к нормальной строке? #1
C++
1
2
3
4
5
6
7
8
// ...
CRecordset *m_rs;
// ...
LVITEM lvi;
// ...
СString s;
m_rs->GetFieldValue(j, s);
lvi.pszText = ?;
Тип lvi.pszText - LPSTR или LPWSTR.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Silver
Сообщений: n/a
15.01.2012, 18:16     Как CString преобразовать к нормальной строке? #2
Что-то типа такого:

lvi.pszText = LPCSTR(s);
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
18.01.2012, 14:32  [ТС]     Как CString преобразовать к нормальной строке? #3
Вопрос вроде бы отпал, но все-равно на это:
lvi.pszText = (LPSTR)s;
компилятор ругается, а на это:
_tcscpy(lvi.pszText, s);
не ругается.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
18.01.2012, 20:43     Как CString преобразовать к нормальной строке? #4
(LPCSTR)s, (LPSTR)((LPCSTR)s)

или универсальные:
(LPCTSTR)s или (LPTSTR)((LPCTSTR)s)

а с копированием tcscpy надо быть поосторожнее, вдруг буфер lvi.pszText будет меньше чем строка s

вообще в С++ при работе со строками следуют для начала понять: где происходит выделение массива символов, и кто заботиться о его удалении, а потом начинать манипуляции, не забывая о том что строка - это не бесконечный набор символов, а массив ограниченной длинны (к классам CString и string вышесказанное не относится)

Удачи,
Владимир
Silver
Сообщений: n/a
19.01.2012, 10:23     Как CString преобразовать к нормальной строке? #5
ВЫ невнимательны, друзья мои!
Я говорил не о ПРИВЕДЕНИИ к типу LPSTR - (LPSTR)s, а об операторе LPCSTR(s).
Видите разницу?
А вот первоисточник, дабы не быть голословным:
CString::operator LPCTSTR
operator LPCTSTR ( ) const;

Return Value

A character pointer to the string’s data.

Remarks

This useful casting operator provides an efficient method to access the null-terminated C string contained in a CString object. No characters are copied; only a pointer is returned. Be careful with this operator. If you change a CString object after you have obtained the character pointer, you may cause a reallocation of memory that invalidates the pointer.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
19.01.2012, 11:47     Как CString преобразовать к нормальной строке? #6
Silver, ты сам невнимателен!

Ты говорил не об операторе LPCTSTR, а об операторе LPCSTR, первым про LPCTSTR сказал я! хе-хе.

Впрочем, если компилировать не для Unicode, то это одно и тоже, хотя я бы рекомендовал писать LPCTSTR, мало ли, вдруг придется перекомпилировать программу в Unicode в скором времени.

Кстати про приведение и оператор... для C++ - это одно и то же. При приведении к типу LPCTSTR объекта класса CString будет вызван оператор LPCTSTR данного класса В твоем же описаннии, что ты вырезал из MSDN, написано в самом первом предложении "This useful casting operator". casting - это и есть приведение типов по-английски.

С уважением,
Владимир
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
19.01.2012, 11:56     Как CString преобразовать к нормальной строке? #7
P.S. ошибка при компиляции у arist''а возникала скорее всего потому, что он приводил к LPSTR, а не к LPCSTR/LPCTSTR. Ключевым здесь являлась буква C - constant. У класса CString нет оператора который бы приводил к указателю на буфер который можно было бы изменять, только на неизменяемый (отюсда C).

Но структура LVITEM требует именно pszText - изменяемую строку (даже если она не меняет эту строку, так сложилось, исторически ), поэтому LPCSTR не подойдет. Есть 2 способа, можно схитрить и привести LPCSTR повторно к LPSTR, а можно создать новый буфер, скопировать в него строку и передать структуре LVITEM.

Я бы пошел вторым путем, хотя первый выглядит быстрее с точки зрения реализации, хотя и менее безоспасным. arist почти добрался до второго способа, хотя я не увидел, где происходит выделение буфера, в коде приведен только оператор копирования. Если arist не выделяет массив символов, то у него могут возникнуть проблемы в будущем при работе его программы.

э-эх..
Silver
Сообщений: n/a
19.01.2012, 13:17     Как CString преобразовать к нормальной строке? #8
Я написал "типа", так как точно не помнил.
Что-то типа такого:

lvi.pszText = LPCSTR(s);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2012, 08:13     Как CString преобразовать к нормальной строке?
Еще ссылки по теме:

strstr из библиотеки cstring, как должно функционировать? C++
Регулярные выражения, Поиск всех видов чисел в строке, CString C++
C++ Ошибка. Невозможно преобразовать CString в float

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

Или воспользуйтесь поиском по форуму:
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
20.01.2012, 08:13  [ТС]     Как CString преобразовать к нормальной строке? #9
За кого вы меня держите! :-)
Естественно где-то в моих многоточиях есть оператор типа lvi.pszText = new char[100];
Спасибо за подробные разъяснения.
Yandex
Объявления
20.01.2012, 08:13     Как CString преобразовать к нормальной строке?
Ответ Создать тему
Опции темы

Текущее время: 07:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru