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

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

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

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

29.07.2012, 00:46. Просмотров 1516. Ответов 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++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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++
4225 / 2199 / 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), у тебя зацикливание очевидно по той же причине.
Thinker
Эксперт C++
4225 / 2199 / 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2012, 16:37
Привет! Вот еще темы с ответами:

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

Подсчитать количество подстрок в текстовом файле - C++
Помогите написать программу которая может подсчитать сколько раз подстрока встречается в текстовом файле.

Свертка повторяющихся подстрок по следующим правилам - C++
Помогите, не могу понять задание. В заданной строке символов выполнить свертку повторяющихся подстрок по следующим правилам: а)...

Найти количество вхождений подстрок в строку - C++
Собственно, в input.txt лежит строка размером до 250 символов, в output.txt нужно найти количество вхождений в нее подстрок, а именно...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.07.2012, 16:37
Ответ Создать тему
Опции темы

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