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

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Gdasar
190 / 51 / 10
Регистрация: 18.02.2013
Сообщений: 487
Записей в блоге: 9
Завершенные тесты: 1
#1

Непонятки с циклами - C++ Builder

24.07.2013, 22:41. Просмотров 728. Ответов 14
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
while(List->Text.Pos("</a>")>0)
   {
   a=(List->Text.Pos("<a href=\""));
   b=(List->Text.Pos("\">"))+2;
   List->Text=List->Text.Delete(a,b-a);
   }
 
 while(List->Text.Pos("</span>")>0)
   {
   a=(List->Text.Pos("<span"));
   b=(List->Text.Pos("</span>"))+7;
   List->Text=List->Text.Delete(a,b-a);
   }
Если в обработчик событий кнопки засунуть весь этот код,то программа намертво виснет.
Скажите,как засунуть все циклы в один так,чтобы все HTML теги были вырезаны. Подтолкните на правильную мысль.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2013, 22:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Непонятки с циклами (C++ Builder):

Основы работ с циклами и функциями - C++ Builder
Дана целочислительная прямоугольная матрица. Определить: 1) количество строк, которые не имеют ни одного нулевого элемента. 2) Найти...

DLL непонятки - C++ Builder
http://www.cyberforum.ru/cpp-builder/thread154847.html Вот прочитал , посмотрел и сразу нарвался на вопрос 2.3. Явная загрузка. &quot;Всё,...

Непонятки с Repaint() - C++ Builder
доброго времени суток, форумчане! в Unit2 прописан код. он компилируется(подозрительно быстро). никаких ошибок и опасений не выдаётся....

Непонятки с C++Builder - C++ Builder
Господа, приветствую всех. Вкратце постараюсь обрисовать суть проблемы - есть статистическая задача в виду курсовой, можете даже не...

Непонятки со StringGrid - C++ Builder
Нужно найти сумму 20 чисел, которые вводятся в StringGrid, и вывести эту сумму в Edit1. Чего я только не пробывал, как я только не...

Непонятки с авторизацией - C++ Builder
Доброго времени суток. В проге есть 2 формы, первая на которой расположены БД и вторая, которая отвечает за авторизацию. Код на кнопку &quot;ОК&quot;...

14
nick42
Практикантроп
4167 / 2200 / 215
Регистрация: 23.09.2011
Сообщений: 4,730
25.07.2013, 00:26 #2
Потому что логика ошибочная. Если уж через while, то приблизительно так:
C++
1
2
3
4
5
6
7
8
9
   int a, b, p=0, z ;
   while(++p < List->Text.Length() )
   {
     z = List->Text.Length();
     if ((a=List->Text.SubString(p,z-p).Pos("<a href=\""))>0) {
       b=(List->Text.SubString(a,z-p).Pos("\">")) ;
       List->Text = List->Text.Delete(a,b+1);
     }
   }
хотя использовать List->Text я бы не рекомендовал... - будут путаться "концы строк" и искажать картину. Лучше обрабатывать список построчно (какой-нибудь StringList).
2
Gdasar
190 / 51 / 10
Регистрация: 18.02.2013
Сообщений: 487
Записей в блоге: 9
Завершенные тесты: 1
25.07.2013, 20:36  [ТС] #3
nick42, все равно никак не пойму.
Вот например писал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for(int i=1; i<List->Count;i++)
{
if(a=List->Strings[i].Pos("<a href=\"")>0)
 {
  b=List->Strings[i].Pos("\">")+2;
  List->Text=List->Text.Delete(a,b-a);
 }
if(a=List->Strings[i].Pos("<span")>0)
   {
   b=(List->Strings[i].Pos("</span>"))+7;
   List->Text=List->Text.Delete(a,b-a);
   }
}
Бред,но все же
P.S. Ваш код так же не работает(удаляет большую часть всего текста и оставляет теги).
HTML5
1
будут путаться "концы строк"
Почему? Ведь мы удаляем текст? P.S.
C++
1
TStringList* List=new TStringList;
Скажите пожалуйста,как правильно построить код для нормального парсинга текста.
0
nick42
Практикантроп
4167 / 2200 / 215
Регистрация: 23.09.2011
Сообщений: 4,730
25.07.2013, 20:45 #4
Цитата Сообщение от Gdasar Посмотреть сообщение
if(a=List->Strings[i].Pos("<a href=\"")>0)
Разве у меня так?! Здесь же a устанавливается равным булевому значению результата СРАВНЕНИЯ номера позиции вхождения href в строку - и нуля (то-есть 0 или 1 в интовом выражении). А в моей записи переменной a присваивалось значение позиции этого вхождения и уже затем анализировалось, - равна она нулю, или нет.
1
Gdasar
190 / 51 / 10
Регистрация: 18.02.2013
Сообщений: 487
Записей в блоге: 9
Завершенные тесты: 1
25.07.2013, 20:51  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
10
if((a=List->Strings[i].Pos("<a href=\""))>0)
 {
  b=List->Strings[i].Pos("\">")+2;
  List->Text=List->Text.Delete(a,b-a);
 }
if((a=List->Strings[i].Pos("<span"))>0)
   {
   b=(List->Strings[i].Pos("</span>"))+7;
   List->Text=List->Text.Delete(a,b-a);
   }
А как зациклить удатение тегов?
0
nick42
Практикантроп
4167 / 2200 / 215
Регистрация: 23.09.2011
Сообщений: 4,730
25.07.2013, 20:54 #6
А вот это чем сердцу не мило? Или опять принцип не понятен?
Цитата Сообщение от nick42 Посмотреть сообщение
int a, b, p=0, z ; while(++p < List->Text.Length() ) {
0
Gdasar
190 / 51 / 10
Регистрация: 18.02.2013
Сообщений: 487
Записей в блоге: 9
Завершенные тесты: 1
25.07.2013, 21:09  [ТС] #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for(int i=1; i<List->Count;i++)
{
while(++p < List->Strings[i].Length() )
 {
  z = List->Strings[i].Length();
 
  if ((a=List->Text.SubString(p,z-p).Pos("<a href=\""))>0)
   {
    b=(List->Text.SubString(a,z-p).Pos("\">"))+2;
    List->Text = List->Text.Delete(a,b);
   }
  if((a=List->Strings[i].SubString(p,z-p).Pos("<span"))>0)
   {
   b=(List->Strings[i].SubString(p,z-p).Pos("</span>"))+7;
   List->Text=List->Text.Delete(a,b-a);
   }
 }
}
Не так? Если нет,то я не совсем уловил Вашу мысль.
0
nick42
Практикантроп
4167 / 2200 / 215
Регистрация: 23.09.2011
Сообщений: 4,730
25.07.2013, 21:18 #8
Только начало правильное... .
Во-первых, в начале итерации p нужно обнулять, иначе смысл while теряется.
Во-вторых, List->Text из прежних вариантов здесь заменяется на List->Strings[i].
List->Text да - строка, но в ней присутствуют спецсимволы перевода строки и в конце - нуль-терминатор. А вообще List - это список, и List->Strings[index] - это полноценная строка со всеми печатаемыми символами, а List->Count (если не ошибаюсь) - это число таких строк в списке. Пройдитесь по ним в цикле и удаляйте ненужные тэги, а после экзекуции можете снова применять List->Text там, где это будет нужно.
1
Gdasar
190 / 51 / 10
Регистрация: 18.02.2013
Сообщений: 487
Записей в блоге: 9
Завершенные тесты: 1
25.07.2013, 21:34  [ТС] #9
Цитата Сообщение от nick42 Посмотреть сообщение
Только начало правильное... .
Во-первых, в начале итерации p нужно обнулять, иначе смысл while теряется.
Сделал.

Цитата Сообщение от nick42 Посмотреть сообщение
Во-вторых, List->Text из прежних вариантов здесь заменяется на List->Strings[i].
Это не правильно?
0
nick42
Практикантроп
4167 / 2200 / 215
Регистрация: 23.09.2011
Сообщений: 4,730
25.07.2013, 21:43 #10
.. нужно писать List->Strings[i] там, где прежде стояло List->Text
1
Gdasar
190 / 51 / 10
Регистрация: 18.02.2013
Сообщений: 487
Записей в блоге: 9
Завершенные тесты: 1
25.07.2013, 21:59  [ТС] #11
nick42, спасибо вам огромное Программа действительно парсит,только виснет немного,но это дело поправимое.
Насчет List->Strings[i],забыл,что удалять теги нужно в отдельной строке,а не во всем StringList.
C++
1
2
3
4
5
 if ((a=List->Strings[i].SubString(p,z-p).Pos("<a href=\""))>0)
   {
   b=(List->Strings[i].SubString(a,z-p).Pos("\">"))+2;
   List->Strings[i] = List->Strings[i].Delete(a,b);
   }
P.S. цикл for нужно начать с 0 а не с 1.
Всем всего доброго
0
nick42
Практикантроп
4167 / 2200 / 215
Регистрация: 23.09.2011
Сообщений: 4,730
25.07.2013, 22:06 #12
и здесь, я думаю, правильнее будет ставить z-a, хотя на результат это, скорее всего, не повлияет
Цитата Сообщение от Gdasar Посмотреть сообщение
b=(List->Strings[i].SubString(a,z-p).Pos("\">"))+2;
1
Gdasar
190 / 51 / 10
Регистрация: 18.02.2013
Сообщений: 487
Записей в блоге: 9
Завершенные тесты: 1
26.07.2013, 14:01  [ТС] #13
Возникли еще вопросы:
1)Почему удаляется пробел?
HTML5
1
<p><a href="/wiki/15_%D0%BC%D0%B0%D1%8F" title="15 мая">15 мая</a> <a href="/wiki/2009_%D0%B3%D0%BE%D0%B4" title="2009 год">2009 года</a>
HTML5
1
<p>15 мая</a>2009 года</a>
Перед 2009 года должен быть пробел,но его нет.

C++
1
2
3
4
5
  if ((a=List->Strings[i].SubString(p,z-p).Pos("<a href=\""))>0)
   {
   b=(List->Strings[i].SubString(a,z-p).Pos("\">"))+1;
   List->Strings[i]= List->Strings[i].Delete(a,b);
   }
2)Из-за чего произошло удаление не того тега?

HTML5
1
<sup id="cite_ref-15" class="reference"><a href="#cite_note-15">[15]</a></sup>
HTML5
1
<sup id="cite_ref-15" class="refere[15]</a></sup>
3)
C++
1
2
3
4
5
6
7
8
9
   int a, b, p=0, z ;
   while(++p < List->Text.Length() )
   {
     z = List->Text.Length();
     if ((a=List->Text.SubString(p,z-p).Pos("<a href=\""))>0) {
       b=(List->Text.SubString(a,z-p).Pos("\">")) ;
       List->Text = List->Text.Delete(a,b+1);
     }
   }
nick42,скажите пожалуйста,почему в 7-й строке b+1,а не b+2,ведь мы ищем два символа ">.

По сути программа должна работать корректно. Я много раз просматривал код,но так и не понял,почему происходит некорректное удаление текста.
0
nick42
Практикантроп
4167 / 2200 / 215
Регистрация: 23.09.2011
Сообщений: 4,730
26.07.2013, 14:30 #14
Цитата Сообщение от Gdasar Посмотреть сообщение
nick42,скажите пожалуйста,почему в 7-й строке b+1,а не b+2,ведь мы ищем два символа ">
ищем два, но позицию возвращает первого, а это по сути и равно длине "лишней подстроки" минус единица. По поводу остального - вам там проще "под микроскопом" какого-нибудь хэкс-редактора изучить различия в неправильной строке, сравнительно с изначальной, чтобы понять причину. Кроме прочего, функция Delete со строкой может работать чересчур "интеллектуально", корректируя результат именно под строку, а не под тэги.
1
Gdasar
190 / 51 / 10
Регистрация: 18.02.2013
Сообщений: 487
Записей в блоге: 9
Завершенные тесты: 1
27.07.2013, 13:20  [ТС] #15
Решил изменить код,но все равно не парсит
C++
1
2
3
4
5
6
7
8
9
 String kkk;
 
if ((a=List->Strings[i].SubString(p,z-p).Pos("<a href=\""))>0)
   {
   b=(List->Strings[i].SubString(a,z-p).Pos("\">"))+1;
   kkk=(List->Strings[i].SubString(a,b));
   List->Strings[i]=StringReplace(List->Strings[i],kkk,"", TReplaceFlags()<< rfReplaceAll << rfIgnoreCase);
   kkk="";
   }
Добавлено через 16 часов 45 минут
Бросил я эту дурную затею
И прибегнул к помощи RegExp
0
27.07.2013, 13:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2013, 13:20
Привет! Вот еще темы с ответами:

Выделываются с циклами - C++
#include &lt;iostream.h&gt; #include &lt;math.h&gt; void main() {int l,n,m,i,j,k,p,NUL=1; cout&lt;&lt;&quot;ENTER NUMBER OF X'S:&quot;; cin&gt;&gt;n;n++; ...

непонятки с Си - C++
вобщем вот что задали Вот что я зделал при выполнении пишет s=none(или nane-как то так)/почему так?где ошибка? у кого то так же...

Непонятки с WXDev C++ - C++
Народ, у кого данный компилятор, помогите разобраться. Вот программа: #include &lt;iostream.h&gt; #include &lt;conio.h&gt; void main() { ...

Непонятки со значком программы - C++ Builder
Здравствуйте. (С++ Builder 6) Установил иконку для программы (Project-&gt;Options и т.д.) Так вот в чем странность: в одной папке иконка...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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