Полная версия этой страницы:
Частичное сравнение строк
BattleMage
25:07:2007, 10:41
Добрый день.
Не подскажите какая функция для частичного сравнения строк в С++Builder-е? ну типа "ВРАЧ" и "ВРАЧиха" будут считаться одинаковыми словами
strcmp() - полное (возвращает значение NULL, если строки идентичны)
European
25:07:2007, 11:56
Для:
BattleMageНужно найти слова, имеющие общую начальную часть или эта часть может быть и в середине слова? Например, СТОЛ и наСТОЛьный
Для общего случая смотреть здесь:
]]>Точный поиск подстроки в строке]]>
BattleMage
25:07:2007, 19:50
Воспользовался примером сранения. Самый долгим, но самым легко программируемым. Вот только как всегда есть небольшие косяки.
Пример такой:
#define EOS '\0'
void BF(char *x, char *y, int m) {
int i;
/* Ищем до конца, вообще говоря можно до позиции n-m */
for(i=0; *y!=EOS; i++, y++) if(memcmp(y,x,m) == 0) OUTPUT(i);
}
Написал я:
#define EOS '\0
...
int l,a=ComboBox1->ItemIndex;
unsigned int i;
l=strlen(Edit1->Text.c_str());
while (!feof(db))
while (fread(ptr,sizeof(kniga),1,db))
for (i=0;i<strlen(ptr->nazvanie);i++)
if (memcmp(ptr->nazvanie,Edit1->Text.c_str(),l)==NULL)
{
k++;
Form1->StringGrid1->Cells[0][k]=ptr->nazvanie;
Form1->StringGrid1->Cells[1][k]=ptr->avtor;
Form1->StringGrid1->Cells[2][k]=ptr->zhanr;
Form1->StringGrid1->Cells[3][k]=ptr->izdatelstvo;
Form1->StringGrid1->Cells[4][k]=IntToStr(ptr->god_izdaniya);
Form1->StringGrid1->Cells[5][k]=IntToStr(ptr->kolvo_str);
if (k!=1) Form1->StringGrid1->RowCount++;
break;
}
Работает, но не так. Вот если слово "Мать" есть и я напишу "Ма", то найдёт. Если "ать", или что-нить где не сначала начинается, то не найдет...
Для: BattleMage
Да настоящие девелоперы не используют стандартнаю библиотеку. И вообще, они настолько суровы, что подпоясываются ломом.
Вынеси то, что у тебя в "if { много строк }" в отдельную функцию. Заведи переменную с нормальным именем для хранения результата вызова Edit1->Text.c_str());. И используй стандарную функцию strstr
для определения, является ли Edit1->Text подстрокой строки ptr->nazvanie. Да, еще: выдай контролам на форме нормальные имена.
BattleMage
26:07:2007, 08:31
Для: Pasha
Противоречишь сам себе: "настоящие девелоперы не используют стандартнаю библиотеку" и "используй стандарную функцию strstr"

Вобщем заработало - спасибо
а вот ещё. Как сделать, чтобы при поиске не учитывался регистр букв, так это кажется наызвается
вот сть книга: "Василий Тёркин". Если введу "Тёр", то найдёт, а если "тёр", то нет...
Для:
BattleMageЦитата(BattleMage @ 26:07:2007, 11:31 )
Противоречишь сам себе: "настоящие девелоперы не используют стандартнаю библиотеку" и "используй стандарную функцию strstr"
Значит тебе придется выбирать: или быть настоящим девелопером, или использовать стандартные функции.
Если не можешь сам написать stristr, то поступи так же, как другие разработчики:
]]>найди чужой исходиник]]>.
European
26:07:2007, 08:58
Цитата(BattleMage @ 26:07:2007, 11:31 )
Противоречишь сам себе: "настоящие девелоперы не используют стандартнаю библиотеку" и "используй стандарную функцию strstr"
Под стандартной библиотекой подразумевалась стандартная библиотека языка С++.
Под стандартной функцией - функция библиотеки времени выполнения (Run-Time Library), которая стандартна для языка Си. Так что никакого противоречия в этой фразе нет.
Единственное противоречие, это каша сишного и плюс-плюсного кода, которая, уж поверь, до добра не доведет. Но это ИМХО
Цитата(European @ 26:07:2007, 11:58 )
Единственное противоречие, это каша сишного и плюс-плюсного кода, которая, уж поверь, до добра не доведет. Но это ИМХО
Хуже всего то, что автор не просто смешивает CRT и STL, но еще и не умеет пользоватся ни одним, ни другим. И рождается код "strlen(Edit1->Text.c_str());".
European
26:07:2007, 09:18
Для: Pasha
Немного не так: не CRT и STL, а CRT и VCL
Для: BattleMage
Открой помощь по AnsiString: там куча удобных функций по работе с VCL-овскими строками
ну вообще- то STL в коде не используется
BattleMage
26:07:2007, 09:45
ну вы все супер мастера своего дела, я же только учюсь... Не судите строго...
BattleMage
26:07:2007, 10:03
Вот ещё вопрос. Никогда не пробывал писать функции под этим Билдером, но под синим экраном (Borland C++) пробывал. Такое ощущение, что их тут как-то по-особому пишут.
Вроде все так:
void vyvod()
{
k++;
Form1->StringGrid1->Cells[0][k]=ptr->nazvanie;
Form1->StringGrid1->Cells[1][k]=ptr->avtor;
Form1->StringGrid1->Cells[2][k]=ptr->zhanr;
Form1->StringGrid1->Cells[3][k]=ptr->izdatelstvo;
Form1->StringGrid1->Cells[4][k]=IntToStr(ptr->god_izdaniya);
Form1->StringGrid1->Cells[5][k]=IntToStr(ptr->kolvo_str);
if (k!=1) Form1->StringGrid1->RowCount++;
}
а он пишет: Declaration syntax error.
Возникает вопрос: где его нужно объявлять?
Для: BattleMage
А где ты ее объявил? и где ты объявил k?
BattleMage
26:07:2007, 10:31
объявил в процедуры по нажатию на клавишу, k - там же...
Для: BattleMage
Ну вот, вынеси ее из процедуры куда-нибудь в более приятное место, ptr передавай параметром.
BattleMage
26:07:2007, 13:35
Для: Pasha
Спасибо большое...
Работает. Сначала сделал как ты сказал ("ptr передавай параметром"), а потом подумал и решил, что и без него обойтись можно. Долго объяснять, вобщем все хорошо. Ещё раз спасибо...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.