Advertisement
dmkozyrev

replace_str

Jan 13th, 2016
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.30 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int replace(char * str, const char * substr, const char * repstr);
  5. int pos(const char * str, const char * substr, int begin);
  6.  
  7. int main(){
  8.     char a[256] = "ABCABCABCABCABC";
  9.     char b[] = "ABC";
  10.     char c[] = "DEFGH";
  11.     printf("a = \"%s\"\n", a);
  12.     printf("b = \"%s\"\n", b);
  13.     printf("c = \"%s\"\n", c);
  14.  
  15.     // В строке a заменим все вхождения строки b на строку c:
  16.     printf("Replace in a all from b to c:\n");
  17.     int count = replace(a, b, c);
  18.     printf("a = \"%s\"\n", a);
  19.     printf("strlen(a) = %d\n", strlen(a));
  20.     printf("count = %d\n", count);
  21.  
  22.     return 0;
  23. }
  24.  
  25. int replace(char * str, const char * substr, const char * repstr){
  26. // Функция заменяет все вхождения строки substr в строку str на строку repstr
  27. // Возвращает количество замен
  28.     char buffer[4096]; // Используем buffer для копирования символов
  29.     int p = -1, i, j, k, count;
  30.     int len = strlen(str); // Длина строки
  31.     int sublen = strlen(substr); // Длина подстроки
  32.     count = i = j = k = 0; // Необходимые счетчики: j для buffer, i для str, k для repstr
  33.  
  34.     while ((p = pos(str, substr, p+1)) > -1){ // Пока есть еще вхождения подстроки
  35.         while (i < p) buffer[j++] = str[i++]; // Копируем часть до позиции вхождения
  36.         i += sublen; // Перепрыгиваем всю подстроку
  37.         while((buffer[j++] = repstr[k++]) != '\0'); // На место подстроки копируем строку, которой мы заменяем
  38.         j--; // Случайно скопировали символ окончания строки, не беда, вернемся на одну позицию влево
  39.         k = 0; // Обнуляем счетчик по repstr для повторного копирования
  40.         count++; // Увеличиваем количество сделанных замен
  41.     }
  42.  
  43.     // Копируем оставшуюся часть строки
  44.     while (i < len) buffer[j++] = str[i++];
  45.  
  46.     // Ставим символ окончания строки
  47.     buffer[j] = '\0';
  48.     // Теперь из buffer все копируем обратно в str
  49.     i = j = 0;
  50.     while ((str[i++] = buffer[j++]) != '\0');
  51.  
  52.     return count;
  53. }
  54.  
  55. int pos(const char * str, const char * substr, int begin){
  56. // Функция ищет первое вхождение подстроки substr в строку str начиная с позиции begin
  57. // Если нашла, то возвращает эту позицию, иначе возвращает -1
  58.     int i, j;
  59.     int len = strlen(str); // Длина строки, в которой необходимо найти подстроку
  60.     int sublen = strlen(substr); // Длина подстроки (которую необходимо найти)
  61.     for(i = begin, j = 0; i < len; i++)
  62.         if (str[i] == substr[j]){
  63.             j++;
  64.             if (j == sublen)
  65.                 return (i-j+1);
  66.         } else if (j != 0){
  67.             j = 0;
  68.             i--;
  69.         }
  70.     return -1;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement