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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
#1

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

18.12.2013, 18:54. Просмотров 1180. Ответов 4
Метки нет (Все метки)

Вообщем,не знаю почему в программе не работает считывание с файла,если в консоли всё ищет корректно,то при чтении из файла,как я понимаю не определяет почему то строку,как исправить?
И ещё как можно сделать,у меня в файле 10 искомых подстрок,как поочереди их искать?

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "stdafx.h"
#include <cstring>
#include <iostream>
#include <fstream>
#include <clocale>
#include <locale>
#include <windows.h>
 
using namespace std;
 
int KMPSearch(char *string, char *substring)    { //в качестве параметров в функцию передается строка и субстрока
 
  int  sl, ssl,count;
  int res = -1;
 
  sl = strlen(string);                                            //присваивается длина строки
    ssl = strlen(substring);                                      //присваивается длина субстроки
  
  if ( sl == 0 )                                                    //проверка строки
    cout << "Неверно задана строка\n"; 
  else if ( ssl == 0 )                                            //проверка субстроки
    cout << "Неверно задана подстрока\n"; 
  else {                                                            //Если все нормально - поехали
    int  i, j = 0, k = -1;
    int  *d;
    d = new int[4000];                                         //создали динамический одномерный массив
    d[0] = -1;                                                    //первый элемент делаем равным -1
    while ( j < ssl - 1 ) {                                      //пока  j < кол-ва эл-тов строки
      while ( k >= 0 && substring[j] != substring[k] ) /*пока k больше или равно 0 и j-тый элемент субстроки не равен
                                                                     k-тому присваиваем k k-тый элемент динамического массива*/
        k = d[k];                                                 
      j++;                                                         //увеличиваем j
      k++;
      if ( substring[j] == substring[k] )                   //если j-ый элемент субстроки равен k-тому
        d[j] = d[k];                                             //присваиваем j-тому элементу динамического массива k-тый
      else                                                         //иначе
        d[j] = k;                                                 //присваиваем k
    }
 
    i = 0;
    j = 0;                                                         //обнулили i, j
    while ( j < ssl && i < sl ){                               //пока j < длины субстроки и i < длины строки
      while ( j >= 0 && string[i] != substring[j] )       // пока j >= 0 и i-ый элемент субстроки не равен j-ому
        j = d[j];                                                  //j присваивается j-ый элемент динамического массива
      i++;
      j++;                                                         //увеличиваем i и j
    }
    
    delete [] d;                                                 //удаляем динам. массив                                                
    res =  j == ssl ? i - ssl : -1;                           // результатом будет i-ssl если j = ssl и -1 в противном случае
  }
  return res;
 
 
 
}
 
int _tmain()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251 );
 
    //Чтение из файла
    /*char s[4000] = {""};
    char q[256];
 
    ifstream filestr("Kniga1.txt");
    
     while (!filestr.eof()) {
        filestr.getline (s,4000);
            cout<<s<<endl;
     }
 
     filestr.close();
 
     ifstream SearchStr("Podstroka.txt");
 
      while (!SearchStr.eof())  {
        SearchStr.getline(q,256);
            cout<<q<<endl;
     }
 
      SearchStr.close();*/
 
    const int n = 10;
 
    srand((unsigned)time(NULL));
 
    int k, cnt = 0;
    char s[] = "boys and girls";
    char q[256];
 
    cout<<s<<endl<<endl;
 
    cout << "Введите строку для поиска:\n"; 
    cin.getline(q,256);
 
    //Кол-во вхождений
    for(int i = 0; i < strlen(s); ++i)
    {
        char tmp[500] = "";
        k = 0;
        if(s[i] == q[0])
        {
            for(int j = i; j <= strlen(q); ++i)
                tmp[k++] = s[j];
 
            if(strcmp(q, tmp))
                ++cnt;
                
            i += strlen(q) - 1;
        }
    }
 
    cout<<cnt<<endl;
 
    int a;
    a = KMPSearch(s,q);
    if(a == -1)
        cout << "net stroki\n\n";
    else
        cout << "Starting with the index " << a << " line in the text" << endl<<endl;
    
    system ("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2013, 18:54     Поиск подстроки в строке
Посмотрите здесь:

C++ Поиск подстроки в строке
C++ Поиск подстроки в строке
Поиск подстроки в строке C++
C++ Поиск подстроки в строке
C++ Поиск подстроки в строке
C++ поиск подстроки в строке
C++ Поиск подстроки в строке
C++ Поиск подстроки в строке в файле
Поиск подстроки в строке C++
Поиск подстроки в строке C++
Поиск подстроки в строке C++
C++ Не работает поиск подстроки в строке

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
180 / 180 / 21
Регистрация: 24.03.2011
Сообщений: 651
Завершенные тесты: 1
18.12.2013, 18:59     Поиск подстроки в строке #2
Цитата Сообщение от faLek Посмотреть сообщение
Как узнать время потраченное на поиск?
Последний пост в Использование inline функций
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
18.12.2013, 19:18  [ТС]     Поиск подстроки в строке #3
monolit, спасибо,но с этим разобрался,вот 2 других вопроса было бы неплохо ,если бы подсказали..
monolit
180 / 180 / 21
Регистрация: 24.03.2011
Сообщений: 651
Завершенные тесты: 1
18.12.2013, 19:27     Поиск подстроки в строке #4
Цитата Сообщение от faLek Посмотреть сообщение
И ещё как можно сделать,у меня в файле 10 искомых подстрок,как поочереди их искать?
туманный вопрос какой-то...
Цитата Сообщение от faLek Посмотреть сообщение
не работает считывание с файла
Что именно не работает?
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
18.12.2013, 19:51  [ТС]     Поиск подстроки в строке #5
monolit, например в файле есть 10 слов,как их по очереди прогнать по всему тексту.Я хочу считать с файла мой текст,по которому я ищу так же считанную с файла подстроку,но поиск не работает.
Yandex
Объявления
18.12.2013, 19:51     Поиск подстроки в строке
Ответ Создать тему
Опции темы

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