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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ отредактировать готовый код http://www.cyberforum.ru/cpp-beginners/thread1047206.html
Отредактируйте пожалуйста готовый код.ТЗ:Написать программу,коротая выводит с клавиатуры массив из 10 целых чисел,считает среднее арифметическое элементов массива и выводит результат пользователь;Затем вводит с клавивиатуры строку длиной не более 20 символов,считает длину введенной строки и выводит ее пользователю. сам код: #include <iostream> #include <locale.h> using namespace std;...
C++ Компактная запись массива структур Можно ли записать массив структур более компактно, чем в приведённом ниже примере? И как это сделать? / control.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> #include <fstream> #include <Windows.h> #include <string.h> http://www.cyberforum.ru/cpp-beginners/thread1047190.html
C++ Cin
Здравствуйте! Не подскажите, как сделать, чтобы после ввода курсор не перескакивал на следующую строчку?
C++ Подсчитать среднее арифметическое элементов, расположенных под побочной диагональю
Помогите пожалуйста=) 1. Подсчитать среднее арифметическое элементов, расположенных под побочной диагональю. одна тема - одна задача - читайте правила форума
C++ Задача C++ http://www.cyberforum.ru/cpp-beginners/thread1047153.html
Даны три числа. Если они могут быть длинами сторон остроугольного треугольника, то выведите их в порядке убывания площадь полученного треугольника.
C++ Обработка исключительных ситуаций Помогите пожалуйста написать программу правильно Функция вычисляет корень квадратного уравнения ax2+bx+c=0 Вот код моей программы, а как собственно обработать исключительные ситуации //с использованием функции #include <iostream> #include <cmath> void KvUravneniye (double, double, double); using namespace std; подробнее

Показать сообщение отдельно
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478

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

18.12.2013, 18:54. Просмотров 1198. Ответов 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru