Advertisement
Guest User

Untitled

a guest
Dec 21st, 2014
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.88 KB | None | 0 0
  1. // kurs_str.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "string.h"
  6. #include <cctype>
  7. #include "iostream"
  8. using namespace std;
  9. 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)
  10. {
  11.  
  12.     //Вычисляем размер новой строки
  13.     //Размер исходной строки + количество замен *(длина слова на которое заменяем - (длина искомого слова + его продолжения))
  14.    
  15. //  unsigned int new_size = strlen(input_str) + number_of_replace * (strlen(replace_word) - strlen(search_word));
  16.     unsigned int new_size = strlen(input_str) - number_of_replace * strlen(search_word) - add_size + strlen(replace_word) * number_of_replace;
  17.     //Выделяем память под новую строку
  18.     char *new_str = new char[new_size];
  19.     //Создаем итераторы
  20.     unsigned int iter_array = 0, iter_new_str = 0;
  21.     //Цикл копирования исходной строки
  22.     for (int i = 0; i < strlen(input_str)  ; i++)
  23.     {
  24.         //Если номер текущего элемента не совпадает с номером начала найденного слова
  25.         if(i != array_of_start_words[iter_array] ||  iter_array >= number_of_replace)
  26.         {
  27.             //То просто копируем исходную строку
  28.             new_str[iter_new_str] = input_str[i];
  29.             iter_new_str++;
  30.         }
  31.         else
  32.         {
  33.  
  34.             //Иначе в исходной строке пропускаем найденное слово
  35.             i = i + strlen(search_word) - 1;
  36.             bool end_search = false; int t = 0;
  37.             while( i < strlen(input_str) + 1 && !end_search)
  38.                     {
  39.                         while(t < strlen(separator_chars))
  40.                         {
  41.                             if(input_str[i] != separator_chars[t])
  42.                             {
  43.                                 t++;
  44.                             }
  45.                             else
  46.                             {
  47.                                 end_search = true;
  48.                                 break;
  49.                                
  50.                             }
  51.                         }
  52.                         i++;
  53.                         t = 0;
  54.                     }
  55.             i-=2;
  56.             //и вместо него в новую строку вставляем слово, на которое нужно заменить
  57.             for (int j = 0; j < strlen(replace_word); j++)
  58.             {
  59.                 new_str[iter_new_str] = replace_word[j];
  60.                 iter_new_str++;
  61.  
  62.             }
  63.             //Увеличиваем итератор массива начала слов
  64.             iter_array++;
  65.            
  66.         }
  67.     }
  68.     //Добавляем признак конца строки
  69.     new_str[iter_new_str] = '\0';
  70.     //Возвращаем результирующую строку
  71.     return new_str;
  72. }
  73. char *search(char *input_str,char *separator_chars, char* search_word, char* replace_word, unsigned int *number_of_replace)
  74. {
  75.     //Вычисляем размеры всех исходных строк
  76.     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);
  77.     //Вычисляем максимальное количество замен
  78.     int size_array = (int)size_input_str/size_search_word + 1;
  79.     //Итератор для массива начала слов
  80.     unsigned int array_iter = 0;
  81.     //Массив начала слов
  82.     int *array_of_start_words = new int[size_array];
  83.     unsigned int add_size = 0;
  84.     //Цикл по исходной строке
  85.     for (int i = 0; i < size_input_str; i++)
  86.     {
  87.         int j = 0;
  88.         //Идем до первого символа, не являющимся разделительным
  89.         while(j < size_separator_chars && i < size_input_str)
  90.         {
  91.             if(input_str[i] == separator_chars[j])
  92.                 {
  93.                     i++;
  94.                     j = 0;
  95.                 }
  96.             else j++;
  97.         }
  98.         //Цикл, проверяющий является ли слово искомым
  99.         j = 0;
  100.        
  101.         while(j < size_search_word && i < size_input_str)
  102.         {
  103.            
  104.             if(input_str[i] == search_word[j])
  105.             {
  106.                 //Если первая буква совпадает, то запоминаем номер элемента в исходной строке
  107.                 if(j == 0)
  108.                 {
  109.                     array_of_start_words[array_iter] = i;
  110.                    
  111.                 }
  112.                 //Переходим к следующему элементу в исходной строке
  113.                     i++;
  114.                    
  115.                 //Если найденная часть слова совпадает с искомым
  116.                 if(j == size_search_word - 1)
  117.                 {
  118.                     //то увеличивает итератор массива начала строк, тем самым запоминая начало найденного слова
  119.                     array_iter++;
  120.                     i++;
  121.                     //Идем до первого символа, являющимся разделительным
  122.                     unsigned int t = 0;
  123.                     bool end_search = false;
  124.                     while( i < size_input_str && !end_search)
  125.                     {
  126.                         while(t < size_separator_chars)
  127.                         {
  128.                             if(input_str[i] != separator_chars[t])
  129.                             {
  130.                                 t++;
  131.                             }
  132.                             else
  133.                             {
  134.                                 i -= 2;
  135.                                 end_search = true;
  136.                                 break;
  137.                             }
  138.                         }
  139.                         add_size++;
  140.                         i++;
  141.                         t = 0;
  142.                     }
  143.                    
  144.                     //Увеличиваем счетчик найденных замен
  145.                     (*number_of_replace)++;
  146.                     j = -1;
  147.                     break;
  148.                    
  149.                 }
  150.             }
  151.             else
  152.             {
  153.             //если буква не совпадает
  154.                 //Пропускаем все буквы до первого разделительного символа, то есть если первая буква не совпала, то слово нам не подходит и мы его пропускаем
  155.                 while( i < size_input_str)
  156.                 {
  157.                     int j1 = 0;
  158.                     //Ищем первый встретившийся разделительный символ
  159.                         while(j1 < size_separator_chars && i < size_input_str)
  160.                         {
  161.                             if(input_str[i] != separator_chars[j1])
  162.                             {
  163.                                 j1++;
  164.  
  165.                             }
  166.                             else
  167.                                 break;
  168.                         }
  169.                         //Если нашли, то переходим к следующей проверке нового слова
  170.                         if(input_str[i] == separator_chars[j1])
  171.                             break;
  172.                         else
  173.                             i++;
  174.                        
  175.                 }
  176.                 break;
  177.            
  178.             }
  179.             j++;
  180.         }
  181.     }
  182.     //Возвращаем строку с замененными словами
  183.     return replace(input_str, separator_chars,search_word,replace_word,array_of_start_words,*number_of_replace,add_size);
  184. }
  185. int main(int argc, _TCHAR* argv[])
  186. {
  187.     setlocale(LC_ALL,"RUSSIAN");
  188.     unsigned int number_of_replace = 0;
  189.    
  190.     cout << "Результирующая строка: " << endl;
  191.     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;
  192.     cout << "Количество замен в строке: " << number_of_replace << endl;
  193.     system("pause");
  194.     return 0;
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement