Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
21 / 12 / 10
Регистрация: 17.05.2014
Сообщений: 154
1

Найти полное вхождение С-style строки в строке

04.10.2015, 14:55. Показов 767. Ответов 2
Метки нет (Все метки)

Друзья, помогите решить задачу.
На вход функции подаётся два указателя. Первый на полную строку, второй на строку паттерна.
Суть задачи в том, чтобы найти позицию первого вхождения паттерна в полную строку.

Дошёл до момента, когда подаётся строка с двумя вхождениями паттерна, одно из которых похоже на паттерн.
Например строка "hellohello1", а паттерн "hello1"
Нужно вывести в данном случае 6. Номер символа плюс 1.

Само собой пользоваться конструкцией string нельзя.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
 
using namespace std;
 
namespace tmp
{
    int strstr(const char *text, const char *pattern)
    {
                // Возможно нужно считать длину строки паттерна?
        int pattern_length = sizeof(pattern);
                
                // Если Паттерн нулевой, то возвращаем 0
        if (*pattern == '\0')
            return 0;
                // Если Строка нулевая, то возвращаем -1
        if (*text == '\0')
            return -1;
 
 
        // Бежим по входящей строке
        while (*text != '\0')
        {
                        // Увеличиваем счётчик
            position++;
 
            // Если первый символ паттерна и текста совпадают
            if (*text == *pattern)
            {
                // Вот тут стопор 
 
                // Возможно это и есть начало нашего варианта               
                // Запоминаем позицию
                // Проверяем, вся ли строка присутствует в варианте
                if (true)
                {
 
                }
                return  position;               
            }
            text++;
            counter++;
        }
        return -1;
    }
}
 
int main()
{
    cout << tmp::strstr("This is my new text text1", "text1");
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2015, 14:55
Ответы с готовыми решениями:

Даны три строки: S1, S2, S3. Заменить в строке S1 первое вхождение строки S2 на S3
Даны три строки: S1, S2, S3. Заменить в строке S1 первое вхождение строки S2 на S3.

Даны две строки. Удалить в первой строке первое вхождение второй строки
Посмотрите пж ребят и напишите , правильно ли я написал. int main() { setlocale(LC_ALL,...

Заменить в строке S последнее вхождение строки S1 на строку S2
2)Даны строки S, S1 и S2. Заменить в строке S последнее вхождение строки S1 на строку...

Заменить в строке S последнее вхождение строки S1 на строку S2
Не понимаю как это реализовать на плюсах

2
56 / 54 / 33
Регистрация: 05.11.2014
Сообщений: 259
04.10.2015, 15:09 2
Извини, не охота читать твой код.
Вот такой метод рабочий (естественно код требует доработки):

C++
1
2
3
4
5
6
7
8
for (i) {// цикл по всей полной строке
   for(j) // цикл по шаблону
       if (text[i+j] == pattern[j]) {
             if (j == patternLen) {
                   cout << i << endl; return;
             }
       } else break;
}
А вот так нельзя делать:

C++
1
2
        // Возможно нужно считать длину строки паттерна?
        int pattern_length = sizeof(pattern);
Надо считать либо вручную до нуль-терминатора, либо функцией strlen. Можно в данной задаче вообще длины не считать, а циклы делать с условием попадания на нуль-терминатор. В общем, разбирайся, друг - задача не сложная.
0
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
04.10.2015, 15:14 3
Demitrius, это одна из тривиальных задач программирования, нахождение подстроки в строке. Тут довольно много алгоритмов, поскольку над эффективным решением задачи нужно подумать. Например, алгоритм Кнута-Морисса-Пратта, или Бойера-Мура.

Если хотите сами реализовать — внутри if (*text == *pattern) ставьте for(int i = 1; i < strlen(pattern); ++i) и сравнивайте символы. Идея понятна?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2015, 15:14

Найти первое вхождение символа в строке
Задана числовая строка с разделительным знаком (&amp;) где то посередине. Мне надо получить числа в...

Найти в заданной строке второе вхождение буквы f и вывести на консоль индекс этого вхождения
Даны условия:&quot; Дана строка. Найдите в этой строке второе вхождение буквы f и выведите индекс этого...

Как найти первое вхождение строки и вернуть всю строку(в которой искали) до конца с места вхождения?
Учу С++ по книге Страуструпа, есть такое задание в конце главы : &quot;Напишите функцию char*...

Найти первое вхождение строки r1 в строке r2
Помогите разобраться со сроками. Мне нужно найти первое вхождение строки r1 в строке r2 и если r1...


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

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

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