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

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем BattleMage, 25 июл 2007.

  1. BattleMage

    BattleMage Гость

    Добрый день.

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

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

    Pasha Гость

    Для: BattleMage
    strncmp
     
  3. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: BattleMage
    Нужно найти слова, имеющие общую начальную часть или эта часть может быть и в середине слова? Например, СТОЛ и наСТОЛьный

    Для общего случая смотреть здесь: Точный поиск подстроки в строке
     
  4. BattleMage

    BattleMage Гость

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

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

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

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

    Pasha Гость

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

    BattleMage Гость

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

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

    Pasha Гость

    Для: 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, то поступи так же, как другие разработчики: найди чужой исходиник.
     
  8. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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), которая стандартна для языка Си. Так что никакого противоречия в этой фразе нет.
    Единственное противоречие, это каша сишного и плюс-плюсного кода, которая, уж поверь, до добра не доведет. Но это ИМХО
     
  9. Pasha

    Pasha Гость

    <!--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());".
     
  10. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: Pasha
    Немного не так: не CRT и STL, а CRT и VCL

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    ну вообще- то STL в коде не используется :)
     
  12. BattleMage

    BattleMage Гость

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

    BattleMage Гость

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

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

    Pasha Гость

    Для: BattleMage
    А где ты ее объявил? и где ты объявил k?
     
  15. BattleMage

    BattleMage Гость

    объявил в процедуры по нажатию на клавишу, k - там же...
     
  16. Pasha

    Pasha Гость

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

    BattleMage Гость

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

Поделиться этой страницей