Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Переместить кусок текста

1.2K
02 декабря 2005 года
richel
142 / / 20.01.2005
Например, есть текст
AnsiString str = "Тридцать три коровы";
По признаку "кор" нужно найти полное слово "корова" и переместить его в начало строки.
Я пытаюсь это сделать через AnsiPos(), но я определяю только позицию начала слова. А само слово как определить - не знаю.
Помогите...:{
335
02 декабря 2005 года
enola
379 / / 25.01.2005
Цитата:
Originally posted by richel
Например, есть текст
AnsiString str = "Тридцать три коровы";
По признаку "кор" нужно найти полное слово "корова" и переместить его в начало строки.
Я пытаюсь это сделать через AnsiPos(), но я определяю только позицию начала слова. А само слово как определить - не знаю.
Помогите...:{



ну так в чем проблема?!
нашли начало строки, потом перебираем подряд все символы за первым пока не "упремся" в пробел, либо знак препинания и т.п., вот тебе последний символ, ну а дальше понятно че делаем :)

362
02 декабря 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by richel
Например, есть текст
AnsiString str = "Тридцать три коровы";
По признаку "кор" нужно найти полное слово "корова" и переместить его в начало строки.
Я пытаюсь это сделать через AnsiPos(), но я определяю только позицию начала слова. А само слово как определить - не знаю.
Помогите...:{



Можно вот так примерно

Код:
String MoveTextToBeg(const String Source, const String What)
{
  String Delims = "., ";
  int Index1 = AnsiPos(Source, What);
  int Index2 = Index1;
  while(!IsDelimiter(Source[++Index2], Delims));
  return
    StrCopy(Source, Index1, Index2-Index1) +
    StrCopy(Source, 0, Index1) +
    StrCopy(Source, Index2, Source.Length()-Index2);
}


но это не код, а только набросок. Во-первых нет под рукой компилятора, во-вторых, давно не брал в руки Builder и могу параметры и имена функций спутать с дельфийскими. Но взять за основу можно.
IsDelimiter - может как-то по другому называется, но такая функция есть в стандартной строквой библиотеке билдера.
StrCopy(String, StartIndex, Len) - кажется есть, а может есть такой метод у AnsiString, не помню точно, глянь в справке.

Желаю удачи.
1.2K
02 декабря 2005 года
richel
142 / / 20.01.2005
 
Код:
bool __fastcall IsDelimiter(const AnsiString& delimiters, int index) const;

записала так:
 
Код:
while(!IsDelimiter(Source[++Index2], Delims, 1)) {

return вроде лишний. На него компилятор ругается.
 
Код:
extern PACKAGE char * __fastcall StrCopy(char * Dest, const char * Source);

Здесь не знаю, как исправить. Немного не понимаю идеи с индексами. Объясните, пожалуйста.
362
02 декабря 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by richel
bool __fastcall IsDelimiter(const AnsiString& delimiters, int index) const;[/code]
записала так:
while(!IsDelimiter(Source[++Index2], Delims, 1)) {
return вроде лишний. На него компилятор ругается.



Тогда уж так
IsDelimiter(Delims, Source[++Index2]);

Фигурную скобку у тебя вижу, а она не нужна, там точка с запятой, потому и на return ругается.


Цитата:
Немного не понимаю идеи с индексами. Объясните, пожалуйста.



Смысл в том, что находим первый индекс - начало слова по заданному шаблону, двигаемся до разделителя слов (например пробела) и находим таким образом второй индекс - конец слова.
все, что между ними вырезаем.

Цитата:
extern PACKAGE char * __fastcall StrCopy(char * Dest, const char * Source);
Здесь не знаю, как исправить.



Через часик домой приду проверю код и напишу тогда результат :)

1.2K
02 декабря 2005 года
richel
142 / / 20.01.2005
Цитата:

Смысл в том, что находим первый индекс - начало слова по заданному шаблону, двигаемся до разделителя слов (например пробела) и находим таким образом второй индекс - конец слова.
все, что между ними вырезаем.


Вряд ли такая ситуация может быть, но все же: а вдруг "кор" будет стоять в середине слова, Тогда отсечется все, что будет стоять после буквы "к". Мне же нужно определить слово целиком?

362
02 декабря 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by richel
Вряд ли такая ситуация может быть, но все же: а вдруг "кор" будет стоять в середине слова, Тогда отсечется все, что будет стоять после буквы "к". Мне же нужно определить слово целиком?



Вот так выглядит функция, середину слова тоже находит

Код:
String MoveTextToBeg(const String Source, const String What)
{
  String Delimiters = " .,;!";
  int Index0 = Source.Pos(What);
  if(Index0 == 0) return ""; // не нашли
  int Index1 = Index0;
  while(--Index1 > 0 && !Source.IsDelimiter(Delimiters, Index1));
  int Len = Source.Length();
  int Index2 = Index0;
  while(++Index2 <= Len && !Source.IsDelimiter(Delimiters, Index2));
  return
    Source.SubString(Index1+1, Index2-Index1-1) +
    Source.SubString(1, Index1) +
    Source.SubString(Index2, Len-Index2+1);
}


Интересно обнаружилось: несмотря что в справке написано "IsDelimiter returns true if the byte indicated by index (counting from 0)
is..."
, это самый IsDelimiter считает с 1 все-таки.
1.2K
02 декабря 2005 года
richel
142 / / 20.01.2005
Задачу мне помогли решить. Дело в том, что это было продолжение уже начатой задачи. Но Ваш код обяэательно посмотрю в выходные. Именно со строкой в таком направлении работаю впервые (ранее были задачки попроще и в основном с БД). Поэтому мне интересно посмотреть, как работают функции.
Спасибо огромное за помощь.:)
1.2K
05 декабря 2005 года
richel
142 / / 20.01.2005
Я посмотрела код. Все работает. И мне он очень инетересен, поскольку я указала только малую толику задачи, которая передо мною стоит. А этот код меня натолкнул на мысль...
Огромное спасибо!:)
2.9K
08 декабря 2005 года
narcotic
41 / / 04.10.2004
Цитата:
Originally posted by richel
Например, есть текст
AnsiString str = "Тридцать три коровы";
По признаку "кор" нужно найти полное слово "корова" и переместить его в начало строки.
Я пытаюсь это сделать через AnsiPos(), но я определяю только позицию начала слова. А само слово как определить - не знаю.
Помогите...:{



AnsiString str = "Тридцать три коровы";
int index = str.Pos("кор");
AnsiString slovo = SubString(index, str.Length());
int index2 = str.Pos("Тридцать");

str.Insert(slovo, index2);
str.Delete(index-1, slovo.Length());

1.2K
08 декабря 2005 года
richel
142 / / 20.01.2005
Цитата:
Originally posted by narcotic
AnsiString str = "Тридцать три коровы";
int index = str.Pos("кор");
AnsiString slovo = SubString(index, str.Length());
int index2 = str.Pos("Тридцать");

str.Insert(slovo, index2);
str.Delete(index-1, slovo.Length());



Спасибо! Пригодится в дальнейшей работе.:)

Вот тут закралась описочка

 
Код:
AnsiString slovo = str.SubString(index, str.Length());

Пропущено str. впереди функции.
2.9K
08 декабря 2005 года
narcotic
41 / / 04.10.2004
Цитата:
Originally posted by richel
Спасибо! Пригодится в дальнейшей работе.:)

Вот тут закралась описочка
 
Код:
AnsiString slovo = str.SubString(index, str.Length());

Пропущено str. впереди функции.


Невнимательность :P

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог