Частичное сравнение строк

  • Автор темы BattleMage
  • Дата начала
B

BattleMage

Гость
#1
Добрый день.

Не подскажите какая функция для частичного сравнения строк в С++Builder-е? ну типа "ВРАЧ" и "ВРАЧиха" будут считаться одинаковыми словами

strcmp() - полное (возвращает значение NULL, если строки идентичны)
 
B

BattleMage

Гость
#4
Воспользовался примером сранения. Самый долгим, но самым легко программируемым. Вот только как всегда есть небольшие косяки.

Пример такой:

#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;
}

Работает, но не так. Вот если слово "Мать" есть и я напишу "Ма", то найдёт. Если "ать", или что-нить где не сначала начинается, то не найдет...
 
P

Pasha

Гость
#5
Для: BattleMage
Да настоящие девелоперы не используют стандартнаю библиотеку. И вообще, они настолько суровы, что подпоясываются ломом.
Вынеси то, что у тебя в "if { много строк }" в отдельную функцию. Заведи переменную с нормальным именем для хранения результата вызова Edit1->Text.c_str());. И используй стандарную функцию strstr
для определения, является ли Edit1->Text подстрокой строки ptr->nazvanie. Да, еще: выдай контролам на форме нормальные имена.
 
B

BattleMage

Гость
#6
Для: Pasha
Противоречишь сам себе: "настоящие девелоперы не используют стандартнаю библиотеку" и "используй стандарную функцию strstr" :)
Вобщем заработало - спасибо

а вот ещё. Как сделать, чтобы при поиске не учитывался регистр букв, так это кажется наызвается
вот сть книга: "Василий Тёркин". Если введу "Тёр", то найдёт, а если "тёр", то нет...
 
P

Pasha

Гость
#7
Для: BattleMage
<!--QuoteBegin-BattleMage+26:07:2007, 11:31 -->
<span class="vbquote">(BattleMage @ 26:07:2007, 11:31 )</span><!--QuoteEBegin-->Противоречишь сам себе: "настоящие девелоперы не используют стандартнаю библиотеку" и "используй стандарную функцию strstr"
[snapback]73449" rel="nofollow" target="_blank[/snapback]​
[/quote]Значит тебе придется выбирать: или быть настоящим девелопером, или использовать стандартные функции.
Если не можешь сам написать stristr, то поступи так же, как другие разработчики: найди чужой исходиник.
 
04.09.2006
2 566
2
Минск
#8
<!--QuoteBegin-BattleMage+26:07:2007, 11:31 -->
<span class="vbquote">(BattleMage @ 26:07:2007, 11:31 )</span><!--QuoteEBegin-->Противоречишь сам себе: "настоящие девелоперы не используют стандартнаю библиотеку" и "используй стандарную функцию strstr"
[snapback]73449" rel="nofollow" target="_blank[/snapback]​
[/quote]
Под стандартной библиотекой подразумевалась стандартная библиотека языка С++.
Под стандартной функцией - функция библиотеки времени выполнения (Run-Time Library), которая стандартна для языка Си. Так что никакого противоречия в этой фразе нет.
Единственное противоречие, это каша сишного и плюс-плюсного кода, которая, уж поверь, до добра не доведет. Но это ИМХО
 
P

Pasha

Гость
#9
<!--QuoteBegin-European+26:07:2007, 11:58 -->
<span class="vbquote">(European @ 26:07:2007, 11:58 )</span><!--QuoteEBegin-->Единственное противоречие, это каша сишного и плюс-плюсного кода, которая, уж поверь, до добра не доведет. Но это ИМХО
[snapback]73455" rel="nofollow" target="_blank[/snapback]​
[/quote]Хуже всего то, что автор не просто смешивает CRT и STL, но еще и не умеет пользоватся ни одним, ни другим. И рождается код "strlen(Edit1->Text.c_str());".
 
04.09.2006
2 566
2
Минск
#10
Для: Pasha
Немного не так: не CRT и STL, а CRT и VCL

Для: BattleMage
Открой помощь по AnsiString: там куча удобных функций по работе с VCL-овскими строками
 
B

BattleMage

Гость
#12
ну вы все супер мастера своего дела, я же только учюсь... Не судите строго... :)
 
B

BattleMage

Гость
#13
Вот ещё вопрос. Никогда не пробывал писать функции под этим Билдером, но под синим экраном (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.

Возникает вопрос: где его нужно объявлять?
 
P

Pasha

Гость
#14
Для: BattleMage
А где ты ее объявил? и где ты объявил k?
 
B

BattleMage

Гость
#15
объявил в процедуры по нажатию на клавишу, k - там же...
 
P

Pasha

Гость
#16
Для: BattleMage
Ну вот, вынеси ее из процедуры куда-нибудь в более приятное место, ptr передавай параметром.
 
B

BattleMage

Гость
#17
Для: Pasha
Спасибо большое...
Работает. Сначала сделал как ты сказал ("ptr передавай параметром"), а потом подумал и решил, что и без него обойтись можно. Долго объяснять, вобщем все хорошо. Ещё раз спасибо...