Форум программистов, компьютерный форум CyberForum.ru

Поиск подстрок - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
29.07.2012, 00:46     Поиск подстрок #1
Задание подсчитать все подстроки с использованием функции strstr(). Делаю так:

C++
1
2
3
4
5
6
7
8
9
10
11
int NumSubStr(char *str1, char *str2){
    int result = 0;
 
    while(strstr(str1,str2)){
          
        result++;
        str1= str1 + (int)(strstr(str1,str2) - str1) + Length(str2);
    }
    
    return result;
}
При таком вызове цикл уходит в бесконечность:
C++
1
cout << NumSubStr("32123412323","");
Почему?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
29.07.2012, 00:51     Поиск подстрок #2
потому что ищется всегда с начала строки. нужно ввести указатель, которому присвоить значение начала строки, и указывать его в качестве первого параметра к strstr(), в общем, примерно так:

C++
1
2
3
4
5
6
7
8
9
int NumSubStr(char *str1, char *str2){
    int result = 0;
    char *pChar = strstr(str1,str2);
    while(pChar != NULL){
          result++;
          pChar = strstr (pChar+1, str2);  
    }
    return result;
}
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
29.07.2012, 01:04  [ТС]     Поиск подстрок #3
Попробуйте вызвать функцию вот так:
C++
1
NumSubStr("123123123","");
Цикл будет бесконечным
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
29.07.2012, 01:12     Поиск подстрок #4
C++
1
2
3
4
5
6
7
8
9
size_t num_substr( const char* str, const char* substr ) {
    size_t res = 0;
    char *p = str;
 
    while ( ( p = strstr( p, substr ) ) && ++res, && ++p)
        ;
 
    return res;
}
Добавлено через 1 минуту
Цитата Сообщение от bgm313 Посмотреть сообщение
Попробуйте вызвать функцию вот так:
это exeption. Обработай его как положено самостоятельно.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
29.07.2012, 13:39  [ТС]     Поиск подстрок #5
Почему возникает это исключение? Насколько мне известно нулевая строка содержит только завершающий ноль. Но при вызове функции с аргументами ("1234","") получается так, что
дальше первого элемента цикл не продвигается. Но 1 - ый элемент не нуль же!

Добавлено через 2 минуты
Может быть строк с 2 сторон ограничивается нулями?
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
29.07.2012, 15:36     Поиск подстрок #6
bgm313, не знаю почему у тебя зацикливание, у меня segmentation fault.
Цитата Сообщение от bgm313 Посмотреть сообщение
Почему возникает это исключение?
оно не возникает, ты(взломщик) его сам специально создаешь. Вот и предусматривай защиту.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
29.07.2012, 15:50     Поиск подстрок #7
Могу предложить такое небольшое видоизменение:
C
1
2
3
4
5
6
7
8
9
10
size_t count_substr( const char* str, const char* substr )
{
    size_t res = 0;
    char *p = str - 1;
    if (*substr == '\0')
       return -1;
    while (p = strstr( ++p, substr ))
        ++res;
    return res;
}
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
29.07.2012, 16:01     Поиск подстрок #8
...
char *strstr(const char *haystack, const char *needle);
...
BUGS
Early versions of Linux libc (like 4.5.26) would not allow an empty
needle argument for strstr(). Later versions (like 4.6.27) work cor‐
rectly, and return haystack when needle is empty.
тут применительно к линуксовой libc (glibc), у тебя зацикливание очевидно по той же причине.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2012, 16:37     Поиск подстрок
Еще ссылки по теме:

C++ Количество подстрок в строке
C++ Реализовать поиск подстрок с помощью недетерминированного конечного автомата
C++ Выделить все вхождения подстрок, заключенных в скобки

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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
29.07.2012, 16:37     Поиск подстрок #9
Для Любителей рекурсии:
C
1
2
3
4
size_t count_substr( const char* str, const char* substr )
{
   return (str = strstr(str, substr)) ? count_substr(str + 1, substr) + 1 : 0;
}
Yandex
Объявления
29.07.2012, 16:37     Поиск подстрок
Ответ Создать тему
Опции темы

Текущее время: 18:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru