Переместить кусок текста
AnsiString str = "Тридцать три коровы";
По признаку "кор" нужно найти полное слово "корова" и переместить его в начало строки.
Я пытаюсь это сделать через AnsiPos(), но я определяю только позицию начала слова. А само слово как определить - не знаю.
Помогите...:{
Например, есть текст
AnsiString str = "Тридцать три коровы";
По признаку "кор" нужно найти полное слово "корова" и переместить его в начало строки.
Я пытаюсь это сделать через AnsiPos(), но я определяю только позицию начала слова. А само слово как определить - не знаю.
Помогите...:{
ну так в чем проблема?!
нашли начало строки, потом перебираем подряд все символы за первым пока не "упремся" в пробел, либо знак препинания и т.п., вот тебе последний символ, ну а дальше понятно че делаем :)
Например, есть текст
AnsiString str = "Тридцать три коровы";
По признаку "кор" нужно найти полное слово "корова" и переместить его в начало строки.
Я пытаюсь это сделать через AnsiPos(), но я определяю только позицию начала слова. А само слово как определить - не знаю.
Помогите...:{
Можно вот так примерно
{
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, не помню точно, глянь в справке.
Желаю удачи.
записала так:
return вроде лишний. На него компилятор ругается.
Здесь не знаю, как исправить. Немного не понимаю идеи с индексами. Объясните, пожалуйста.
bool __fastcall IsDelimiter(const AnsiString& delimiters, int index) const;[/code]
записала так:
while(!IsDelimiter(Source[++Index2], Delims, 1)) {
return вроде лишний. На него компилятор ругается.
Тогда уж так
IsDelimiter(Delims, Source[++Index2]);
Фигурную скобку у тебя вижу, а она не нужна, там точка с запятой, потому и на return ругается.
Смысл в том, что находим первый индекс - начало слова по заданному шаблону, двигаемся до разделителя слов (например пробела) и находим таким образом второй индекс - конец слова.
все, что между ними вырезаем.
Здесь не знаю, как исправить.
Через часик домой приду проверю код и напишу тогда результат :)
Смысл в том, что находим первый индекс - начало слова по заданному шаблону, двигаемся до разделителя слов (например пробела) и находим таким образом второй индекс - конец слова.
все, что между ними вырезаем.
Вряд ли такая ситуация может быть, но все же: а вдруг "кор" будет стоять в середине слова, Тогда отсечется все, что будет стоять после буквы "к". Мне же нужно определить слово целиком?
Вряд ли такая ситуация может быть, но все же: а вдруг "кор" будет стоять в середине слова, Тогда отсечется все, что будет стоять после буквы "к". Мне же нужно определить слово целиком?
Вот так выглядит функция, середину слова тоже находит
{
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 все-таки.
Спасибо огромное за помощь.:)
Огромное спасибо!:)
Например, есть текст
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());
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());
Спасибо! Пригодится в дальнейшей работе.:)
Вот тут закралась описочка
Пропущено str. впереди функции.
Спасибо! Пригодится в дальнейшей работе.:)
Вот тут закралась описочка
Пропущено str. впереди функции.
Невнимательность :P