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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
#1

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2012, 15:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как CString преобразовать к нормальной строке? (C++):

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

Как преобразовать long 12345 в CString "12345"? - C++
Как преобразовать long 12345 в CString '12345' ? Например: int a = 12345; CString b = 'Число: '; CString c;Нужно: c = a + b; (c...

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

string и cstring. Как это устроено? - C++
Здравствуйте. Изучаю азы С++. В процессе возникло несколько вопросов. Вопросы простые, но мне мешают. Во-первых. В стандартном наборе...

strstr из библиотеки cstring, как должно функционировать? - C++
Вот у меня есть описание, переписано из книги: Вот программа: #include <iostream> using std::cin; using std::cout; ...

Как из CString получить int ... заранее спасибо!! - C++
Проблемка ... Как из CString получить int.... только плиз не советуйте куда заглядывать в MSDN у меня его нету.... СПАСИБО....

8
Silver
Сообщений: n/a
15.01.2012, 18:16 #2
Что-то типа такого:

lvi.pszText = LPCSTR(s);
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
18.01.2012, 14:32  [ТС] #3
Вопрос вроде бы отпал, но все-равно на это:
lvi.pszText = (LPSTR)s;
компилятор ругается, а на это:
_tcscpy(lvi.pszText, s);
не ругается.
0
boombastik
7 / 7 / 0
Регистрация: 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
Сообщений: n/a
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.
boombastik
7 / 7 / 0
Регистрация: 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
boombastik
7 / 7 / 0
Регистрация: 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
Сообщений: n/a
19.01.2012, 13:17 #8
Я написал "типа", так как точно не помнил.
Что-то типа такого:

lvi.pszText = LPCSTR(s);
arist
0 / 0 / 0
Регистрация: 14.02.2011
Сообщений: 100
20.01.2012, 08:13  [ТС] #9
За кого вы меня держите! :-)
Естественно где-то в моих многоточиях есть оператор типа lvi.pszText = new char[100];
Спасибо за подробные разъяснения.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2012, 08:13
Привет! Вот еще темы с ответами:

Как перевести CString -ское число в Int? - C++
Есть CString -ское число. Как перевести это число в int??? Вот: { m_cap = m_cap + '1'; m_cap = c; int c = attol(m_cap); c =...

Как с использованием CString выбрать слова из строки длинной 4 символа и записать их в файл? - C++
Как с использованием CString выбрать слова из строки длинной 4 символа и записать их в файл?

Преобразовать в строке все строчные буквы (как латинские, так и русские) в прописные, а прописные — в строчные - C++
Дана строка. Преобразовать в ней все строчные буквы (как латинские, так и русские) в прописные, а прописные — в строчные.

Вводится строка. Все буквы в строке преобразовать в заглавные - C++
Написать программу, которая принимает от пользователя одну или две строки, в зависимости от задачи. Решать задачи рекомендуется двумя...


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
20.01.2012, 08:13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru