Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 2 / 1
Регистрация: 14.02.2011
Сообщений: 100
1

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

15.01.2012, 15:02. Показов 2667. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.01.2012, 15:02
Ответы с готовыми решениями:

Как преобразовать числовые типы в CString и обратно с помощью MFC?
Я нашол в MSDN-е C-шные функции из stdlib.h типа :atof(), atoi() но это C-шные а как же MFC .Нашол...

Преобразовать float в CString
Никак не могу решить проблему void CFunction2ArgDlg::OnBnClickedButton1() { CString S;...

Ошибка. Невозможно преобразовать CString в float
Здравствуйте! Программа заключается в следующем - пользователь добавляет в EditControl данные,...

Преобразовать отношение к 3-й нормальной форме СЧЕТ
Дали задачу - Преобразовать следующее отношение к 3-й нормальной форме СЧЕТ (Номер,...

8
Silver
15.01.2012, 18:16 2
Что-то типа такого:

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

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

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

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

Удачи,
Владимир
0
Silver
19.01.2012, 10:23 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.
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
19.01.2012, 11:47 6
Silver, ты сам невнимателен!

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

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

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

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

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

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

э-эх..
0
Silver
19.01.2012, 13:17 8
Я написал "типа", так как точно не помнил.
Что-то типа такого:

lvi.pszText = LPCSTR(s);
0 / 2 / 1
Регистрация: 14.02.2011
Сообщений: 100
20.01.2012, 08:13  [ТС] 9
За кого вы меня держите! :-)
Естественно где-то в моих многоточиях есть оператор типа lvi.pszText = new char[100];
Спасибо за подробные разъяснения.
0
20.01.2012, 08:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.01.2012, 08:13
Помогаю со студенческими работами здесь

Преобразовать отношение к третьей нормальной форме Рейс
прошу помочь, нужно преобразовать отношение к третьей нормальной форме Рейс (№ рейса, Дата вылета,...

Удвоить слеши в строке CString
Есть строка СString, в ней не подрят стоят слеши, как их удвоить?:huh: исходная строка:...

Как преобразовать long 12345 в CString "12345"?
Как преобразовать long 12345 в CString '12345' ? Например: int a = 12345; CString b = 'Число:...

Регулярные выражения, Поиск всех видов чисел в строке, CString
Здравствуйте Уважаемые Дамы и Господа. Уже какой вечер мучаюсь, пытаюсь понять как решить...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru