12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
1

Поиск подстрок

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

Author24 — интернет-сервис помощи студентам
Задание подсчитать все подстроки с использованием функции 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","");
Почему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2012, 00:46
Ответы с готовыми решениями:

Поиск и вывод подстрок
злорадствуйте подскажите пожалуйста немного запутался как вывести через find все подстроки строки...

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

Поиск в файле и замена подстрок используя string
Мне надо сделать замену всех подстрок в файле С++ средства ограничены std. То есть std::string и...

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

8
556 / 510 / 25
Регистрация: 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;
}
1
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
29.07.2012, 01:04  [ТС] 3
Попробуйте вызвать функцию вот так:
C++
1
NumSubStr("123123123","");
Цикл будет бесконечным
0
Заблокирован
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. Обработай его как положено самостоятельно.
0
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
29.07.2012, 13:39  [ТС] 5
Почему возникает это исключение? Насколько мне известно нулевая строка содержит только завершающий ноль. Но при вызове функции с аргументами ("1234","") получается так, что
дальше первого элемента цикл не продвигается. Но 1 - ый элемент не нуль же!

Добавлено через 2 минуты
Может быть строк с 2 сторон ограничивается нулями?
0
Заблокирован
29.07.2012, 15:36 6
bgm313, не знаю почему у тебя зацикливание, у меня segmentation fault.
Цитата Сообщение от bgm313 Посмотреть сообщение
Почему возникает это исключение?
оно не возникает, ты(взломщик) его сам специально создаешь. Вот и предусматривай защиту.
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 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;
}
0
Заблокирован
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), у тебя зацикливание очевидно по той же причине.
1
Эксперт С++
4267 / 2241 / 203
Регистрация: 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;
}
1
29.07.2012, 16:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2012, 16:37
Помогаю со студенческими работами здесь

вырезки подстрок
написал вот такой код #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; #include...

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

Замена подстрок в строке
Кто знает, как в данной строке заменить все подстроки &quot;123&quot; на &quot;456&quot;?

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

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

Подсчёт количества подстрок
Посмотрите пожалуйста нормально ли написана функция, которая считает количество подстрок? int...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru