Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // kurs_str.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #include "string.h"
- #include <cctype>
- #include "iostream"
- using namespace std;
- char *replace(char *input_str, char *separator_chars, char* search_word,char* replace_word, int *array_of_start_words, unsigned int number_of_replace, unsigned int add_size)
- {
- //Вычисляем размер новой строки
- //Размер исходной строки + количество замен *(длина слова на которое заменяем - (длина искомого слова + его продолжения))
- // unsigned int new_size = strlen(input_str) + number_of_replace * (strlen(replace_word) - strlen(search_word));
- unsigned int new_size = strlen(input_str) - number_of_replace * strlen(search_word) - add_size + strlen(replace_word) * number_of_replace;
- //Выделяем память под новую строку
- char *new_str = new char[new_size];
- //Создаем итераторы
- unsigned int iter_array = 0, iter_new_str = 0;
- //Цикл копирования исходной строки
- for (int i = 0; i < strlen(input_str) ; i++)
- {
- //Если номер текущего элемента не совпадает с номером начала найденного слова
- if(i != array_of_start_words[iter_array] || iter_array >= number_of_replace)
- {
- //То просто копируем исходную строку
- new_str[iter_new_str] = input_str[i];
- iter_new_str++;
- }
- else
- {
- //Иначе в исходной строке пропускаем найденное слово
- i = i + strlen(search_word) - 1;
- bool end_search = false; int t = 0;
- while( i < strlen(input_str) + 1 && !end_search)
- {
- while(t < strlen(separator_chars))
- {
- if(input_str[i] != separator_chars[t])
- {
- t++;
- }
- else
- {
- end_search = true;
- break;
- }
- }
- i++;
- t = 0;
- }
- i-=2;
- //и вместо него в новую строку вставляем слово, на которое нужно заменить
- for (int j = 0; j < strlen(replace_word); j++)
- {
- new_str[iter_new_str] = replace_word[j];
- iter_new_str++;
- }
- //Увеличиваем итератор массива начала слов
- iter_array++;
- }
- }
- //Добавляем признак конца строки
- new_str[iter_new_str] = '\0';
- //Возвращаем результирующую строку
- return new_str;
- }
- char *search(char *input_str,char *separator_chars, char* search_word, char* replace_word, unsigned int *number_of_replace)
- {
- //Вычисляем размеры всех исходных строк
- unsigned int size_input_str = strlen(input_str),size_separator_chars = strlen(separator_chars),size_search_word = strlen(search_word),size_replace_word = strlen(replace_word);
- //Вычисляем максимальное количество замен
- int size_array = (int)size_input_str/size_search_word + 1;
- //Итератор для массива начала слов
- unsigned int array_iter = 0;
- //Массив начала слов
- int *array_of_start_words = new int[size_array];
- unsigned int add_size = 0;
- //Цикл по исходной строке
- for (int i = 0; i < size_input_str; i++)
- {
- int j = 0;
- //Идем до первого символа, не являющимся разделительным
- while(j < size_separator_chars && i < size_input_str)
- {
- if(input_str[i] == separator_chars[j])
- {
- i++;
- j = 0;
- }
- else j++;
- }
- //Цикл, проверяющий является ли слово искомым
- j = 0;
- while(j < size_search_word && i < size_input_str)
- {
- if(input_str[i] == search_word[j])
- {
- //Если первая буква совпадает, то запоминаем номер элемента в исходной строке
- if(j == 0)
- {
- array_of_start_words[array_iter] = i;
- }
- //Переходим к следующему элементу в исходной строке
- i++;
- //Если найденная часть слова совпадает с искомым
- if(j == size_search_word - 1)
- {
- //то увеличивает итератор массива начала строк, тем самым запоминая начало найденного слова
- array_iter++;
- i++;
- //Идем до первого символа, являющимся разделительным
- unsigned int t = 0;
- bool end_search = false;
- while( i < size_input_str && !end_search)
- {
- while(t < size_separator_chars)
- {
- if(input_str[i] != separator_chars[t])
- {
- t++;
- }
- else
- {
- i -= 2;
- end_search = true;
- break;
- }
- }
- add_size++;
- i++;
- t = 0;
- }
- //Увеличиваем счетчик найденных замен
- (*number_of_replace)++;
- j = -1;
- break;
- }
- }
- else
- {
- //если буква не совпадает
- //Пропускаем все буквы до первого разделительного символа, то есть если первая буква не совпала, то слово нам не подходит и мы его пропускаем
- while( i < size_input_str)
- {
- int j1 = 0;
- //Ищем первый встретившийся разделительный символ
- while(j1 < size_separator_chars && i < size_input_str)
- {
- if(input_str[i] != separator_chars[j1])
- {
- j1++;
- }
- else
- break;
- }
- //Если нашли, то переходим к следующей проверке нового слова
- if(input_str[i] == separator_chars[j1])
- break;
- else
- i++;
- }
- break;
- }
- j++;
- }
- }
- //Возвращаем строку с замененными словами
- return replace(input_str, separator_chars,search_word,replace_word,array_of_start_words,*number_of_replace,add_size);
- }
- int main(int argc, _TCHAR* argv[])
- {
- setlocale(LC_ALL,"RUSSIAN");
- unsigned int number_of_replace = 0;
- cout << "Результирующая строка: " << endl;
- cout << search("There are many big and small libraries, everywhere in our! country. They, every have! mileverlions: of books? everywhere in different languages. "," ,!:?.", "ever", "mmmmmm", &number_of_replace) << endl;
- cout << "Количество замен в строке: " << number_of_replace << endl;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement