Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2009, 22:58   #1
Lazio
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 113
По умолчанию Замена или вставка символа в char *.

Вот делаю курсовую - программу, расставляющую переносы в тексте заданной длины. Вопрос такой:

делаю перевод из AnsiString в char * так:

Код:
char *text =" ";
text = RichEdit1->Text.c_str();
Как мне потом работать с полученным текстом (char *text). Хотел вот так:

Код:
for (int i=0; i<LENGHT; i++){

if (*(text+i)=='\n') { *(text+i)=' ';}

}
попросту говоря хочу для начала удалить все знаки перевода строки, а потом уже работать дальше, но слышал что-то что полученный текст это const char* и его можно только читать . Как выбираться из этой ситуации.

PS: Работать с AnsiString не хочу так что желательно подскажите как реализовать через char*
Lazio вне форума Ответить с цитированием
Старый 29.09.2009, 23:02   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Не ясно чем не устраивает AnsiString, но раз уж на то пошло, то:
Код:
char* text = (char*)RichEdit1->Text.c_str();
Спецификатор const предотвращает неосознанные ошибки, но можно привести тип к не const, считается, что программист делает это осознанно и понимает последствия, потому
Цитата:
const char* и его можно только читать
условное ограничение

Последний раз редактировалось netrino; 29.09.2009 в 23:04.
netrino вне форума Ответить с цитированием
Старый 29.09.2009, 23:07   #3
Lazio
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 113
По умолчанию

Попроьывал обратный перевод в окно RichEdit2 всё отлично переменная записывается
Lazio вне форума Ответить с цитированием
Старый 29.09.2009, 23:08   #4
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

char* это указатель на первый элемент массива.
dampirik вне форума Ответить с цитированием
Старый 29.09.2009, 23:11   #5
Lazio
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 113
По умолчанию

ну например если i-ый элемент равен ну пусть 'е' вставить после него в позицию i+1 знак '-'; и также интересует удаление знаков переноса char *.
Lazio вне форума Ответить с цитированием
Старый 29.09.2009, 23:34   #6
Lazio
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 113
По умолчанию

Код:
char* text = (char*)RichEdit1->Text.c_str();

     AnsiString st;

  int lenght;
  lenght = StrLen(text);

 for (int i=lenght; i>=0; i--){

 if (*(text+i)=='e'){

  *(text+i)='b';


  }
  }

st=text;

RichEdit1->Lines->Add(st);
вот это типа как действует но с вылетом ошибки Rich Edit line insertion error

Последний раз редактировалось Sazary; 30.09.2009 в 00:45.
Lazio вне форума Ответить с цитированием
Старый 29.09.2009, 23:45   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Lazio Посмотреть сообщение
char* text = (char*)RichEdit1->Text.c_str();
Руки за это надо отрывать. Да и вообще за убирание константности у непонятно чего. Константность можно убирать только в том случае, если передавали неконстантный объект и он сделался константным, т.е. известно происхождение константности и что оно является "искусственным". Ну, грубо говоря, есть такая функция:
Код:
char const* foo(char* str)
{
  return str;
}
Результат этот функции впоследствии можно будет достаточно безопасно преобразовать к неконстантным данным.
В данном же случае неизвестно что возвращается и неизвестно как это используется внутри класса. Вообще не факт, что c_str возвращает указатель на тот участок памяти, в котором строка хранится. Это может быть вспомогательный буфер какой-то или еще чего и его изменение может привести к чему угодно.

Религия не позволяет вместо *(text+i) писать RichEdit1->Text[i] ?
pu4koff вне форума Ответить с цитированием
Старый 29.09.2009, 23:59   #8
Lazio
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 113
По умолчанию

Ок кто нибудь может поподробнее как обращаться с этим в моем случае: 1) замены знаков переноса на пробел 2) и вставка символа переноса в опр. место.
так
Код:
 for (int i=0; i<=10; i++){

 if (RichEdit1->Text[i]=='d'){

 RichEdit1->Text[i]='b';
 }
 }
отсылает к строке
ThrowIfOutOfRange(idx); // Should Range-checking be optional to avoid overhead ??

в dstring.h

всё понял это я вылетел за пределы в цикле) ладно пока сам поработаю если что напишу)

Последний раз редактировалось Sazary; 30.09.2009 в 00:46.
Lazio вне форума Ответить с цитированием
Старый 30.09.2009, 00:12   #9
Lazio
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 113
По умолчанию

нет все-таки тут что то ещё :-(
Код:
 for (int i=1; i<=10; i++){

 if (RichEdit1->Text[i]=='\n'){

 RichEdit1->Text[i]='f';
 }

 }
PS: за пределы 1-10 не вылетал

Последний раз редактировалось Sazary; 30.09.2009 в 00:46.
Lazio вне форума Ответить с цитированием
Старый 30.09.2009, 00:25   #10
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

А что повыше идет? можно посмотреть?
dampirik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TStringList Замена символа на ряд символов. Alex Cones Общие вопросы Delphi 17 23.03.2010 20:00
Замена символа Flippp Общие вопросы C/C++ 20 24.06.2009 17:18
Вставка картинки реальных размеров или хотябы в пропорции Mbus Microsoft Office Excel 4 02.12.2008 09:55
Перл. Замена символа \ на символ / Stilet PHP 1 12.04.2008 10:17
Есть таблица - В ней три поля int, char, char нужно чтобы данные заносились в таблицу Mysql Muahahaha PHP 8 27.03.2008 11:17