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

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

Войти
Регистрация
Восстановить пароль
 
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
#1

Вхождение подстроки в строку - C++

19.12.2013, 00:48. Просмотров 407. Ответов 4
Метки нет (Все метки)

Не правильно считает вхождение подстроки в строку,данные читаются из файлов.

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
int _tmain()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251 );
 
    //Чтение из файла
    int k, cnt = 0;
    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[] = "You can find books on literature, physics, history, chemistry, geography, biology and other subjects";
    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;
0
Вложения
Тип файла: txt Kniga1.txt (5.6 Кб, 2 просмотров)
Тип файла: txt Podstroka.txt (2 байт, 2 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2013, 00:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вхождение подстроки в строку (C++):

Мне надо сделать поиск последнего вхождения подстроки s1 в строку s(с функцией LastPos, не strstr). В этом коде просто вхождение подстроки в строку. - C++
#include &lt;stdio.h&gt; int count_of_substrings(string s, string s1){ int start = 0; int count = 0; int pos = 0; ...

Вхождение подстроки в строку - C++
Написать функцию , котоpая находит пеpвую по поpядку позицию вхождения подстpоки в указанную пользователем стpоку , начи- ная с...

Найти последнее вхождение подстроки в строку - C++
Нужно нати последнее вхождение определенной подстроки в строку. Help!

Как можно найти вхождение подстроки в строку без строковых функций? - C++
Как можно найти вхождение подстроки в строку без строковых функций?

Ближайшее вхождение подстроки - C++
Здравствуйте, есть текст и переменная с позицией последнего клика на этом тексте, нужно найти 2 ближайших вхождения определённой...

Удалить из строки каждое вхождение подстроки - C++
Удалить из строки s каждое вхождение подстроки s1. На С++ Дублирование тем запрещено правилами форума (п. 3.4). Не плодите...

4
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.12.2013, 01:02 #2
вот может адаптируете под чтение из файлов.
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
#include <iostream>
#include <string>
 
std::size_t GetTemplatesCountInString(const std::string& str, const std::string& templ)
{
  if (str.empty() || templ.empty())
  {
    return 0;
  }
 
  std::size_t count = 0;
  std::string::size_type offset = 0;
  while (true)
  {
    const std::string::size_type templPos = str.find(templ, offset);
    if (templPos == std::string::npos)
    {
      break;
    }
 
    ++count;
 
    offset = templPos + templ.size();
    if (offset > str.size())
    {
      break;
    }
  }
 
  return count;
}
 
int main()
{
  const std::string str = "aa aa, aa, aa bb";
  const std::string templ = "aa";
  std::cout << "templates count = " << GetTemplatesCountInString(str, templ) << std::endl;
  return 0;
}
0
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
19.12.2013, 01:11  [ТС] #3
DU, такие же результаты,как и в моём случае
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.12.2013, 01:28 #4
хз. может быть дело в кодировке. вот если читать бинарно файлы, у меня выходит:

str size = 5779
templ size = 2
templates count = 14

регистр при поиске учитывается. т.е. Эт искать не будет. только эт


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>
#include <string>
#include <fstream>
#include <iterator>
 
std::size_t GetTemplatesCountInString(std::string str, const std::string& templ)
{
  if (str.empty() || templ.empty())
  {
    return 0;
  }
 
  std::size_t count = 0;
  std::string::size_type offset = 0;
  while (true)
  {
    const std::string::size_type templPos = str.find(templ, offset);
    if (templPos == std::string::npos)
    {
      break;
    }
 
    ++count;
 
    offset = templPos + templ.size();
    if (offset > str.size())
    {
      break;
    }
  }
 
  return count;
}
 
std::string ReadDataFromFile(const std::string& filePath)
{
  std::ifstream file;
  file.exceptions(std::ios::badbit | std::ios::failbit);
  file.open(filePath, std::ios::in | std::ios::binary);
  return std::string((std::istreambuf_iterator<char>( file ) ), std::istreambuf_iterator<char>());
}
 
int main()
{
  const std::string str = ReadDataFromFile("d:\\tmp\\Kniga1.txt");
  const std::string templ = ReadDataFromFile("d:\\tmp\\Podstroka.txt");
  std::cout << "str size = " << str.size() << std::endl;
  std::cout << "templ size = " << templ.size() << std::endl;
  std::cout << "templates count = " << GetTemplatesCountInString(str, templ) << std::endl;
  return 0;
}
Добавлено через 4 минуты
для учета регистра начинается совсем другая история. там конвертить в юникод нужно или с локалями колдовать. в общем не английским тестом придется помучится. оставляю это вам
1
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
19.12.2013, 01:52  [ТС] #5
DU, спасибо,вроде как заработало))
0
19.12.2013, 01:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2013, 01:52
Привет! Вот еще темы с ответами:

Найти первое вхождение подстроки и передать указатель - C++
Есть cимвoльная cтрока и подcтpока. Нужно найти пepвоe вхождение подстроки в строку и передать указатель на первый симвoл данного...

Функция находящее в строке заданное вхождение подстроки - C++
Описать функцию PosK(S0, S, K) целого типа, возвращающую номер позиции, начиная с которой в строке S содержится K-е вхождение подстроки S0...

Заменить в строке последнее вхождение данной подстроки на другую подстроку - C++
Даны строки s,s1 и s2. Заменить в строке S последнее вхождение строки S1 на строку S2 через char

Написать функцию, которая возвращает указатель на первое вхождение подстроки string2 в строке string1 - C++
char* strstr(char* string1, char* string2) Возвращает указатель на первое вхождение подстроки string2 в строке string1. В случае неудачи...


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

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

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