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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
#1

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

29.07.2012, 00:46. Просмотров 1500. Ответов 8
Метки нет (Все метки)

Задание подсчитать все подстроки с использованием функции 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","");
Почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2012, 00:46     Поиск подстрок
Посмотрите здесь:

Поиск подстрок в строках и вывод в файл - C++
Дан файл, html код страницы, в котором есть повторения типа &quot;email: password&quot;, например: lal@mail.ru: TXGgQ32Bh8J7PQn6J ...

Реализовать поиск подстрок с помощью недетерминированного конечного автомата - C++
Всем привет!Сразу к сути задачи.Необходимо реализовать поиск подстрок с помощью недетерминированного конечного автомата. Вообще не...

Удаление подстрок из строки - C++
Помогите, пожалуйста, с реализацией функции. Есть строка str типа string и строка it типа char. Нужно из str удалить все it. Например, ...

Молниеносное нахождение подстрок - C++
Воодится число тестов. Далее каждый тест содержит 2 строки. Подстроку и текст. Надо найти количество подстрок в тексте. Количество тестов...

Количество подстрок в строке - C++
Нужно что-бы пользователь ввел 2 строки и ему вывело сообщение о том, сколько раз встречается строка 2 в первой строке. Как это сделать без...

Подсчёт количества подстрок - C++
Посмотрите пожалуйста нормально ли написана функция, которая считает количество подстрок? int SearchSubString(char *s1,char *s2){ ...

Удаление всех подстрок из строки - C++
Здравствуйте. После выполнения моей программы у меня выдает вот такую ошибку #include &lt;iostream&gt; #include &lt;string&gt; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
551 / 504 / 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
Заблокирован
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
Заблокирован
29.07.2012, 15:36     Поиск подстрок #6
bgm313, не знаю почему у тебя зацикливание, у меня segmentation fault.
Цитата Сообщение от bgm313 Посмотреть сообщение
Почему возникает это исключение?
оно не возникает, ты(взломщик) его сам специально создаешь. Вот и предусматривай защиту.
Thinker
Эксперт C++
4221 / 2195 / 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
Заблокирован
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++
Собственно, в input.txt лежит строка размером до 250 символов, в output.txt нужно найти количество вхождений в нее подстрок, а именно...

Реализация алгоритма поиска подстрок чжу такаоки на c++ - C++
У кого нибудь есть алгоритм поиска подстрок чжу такаоки на c++?)

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


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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
4221 / 2195 / 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     Поиск подстрок
Ответ Создать тему
Опции темы

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