Массив строк: заменить все вхождения suf1 в строке на suf2 - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Задается массив строк. Каждая строка включает в себя Фамилию Имя Отчество. Задается две строки (суффиксы) (например, "ov" "idze" или "chuk" "ko") suf1 и suf2. Заменяем все вхождения suf1 в фамилию на suf2. Прим. в данной работе не пользоваться библиотечными функциями string.h.Все необходимые функции реализовывать вручную.
Листинг программы
  1. #include"stdio.h"
  2. void Replace(char str[],char a[],char b[],char buffer[])
  3. {
  4. int i,j,pos=0;
  5. for(i=0;str[i];i++)
  6. {
  7. for(j=0;str[i+j]&&a[j];j++) //начинается ли с i-ой позиции строка a
  8. if(str[i+j]!=a[j]) break;
  9. if(!a[j]) //если a[j]=0, то мы дошли до конца строки a
  10. {
  11. i+=j-1; //в j у нас длина стоки a, которую мы перепрыгиваем
  12. for(j=0;b[j];j++) buffer[pos++]=b[j]; //на место стоки a ставим строку b
  13. }
  14. else
  15. {
  16. buffer[pos++]=str[i]; //просто копируем символ
  17. }
  18. buffer[pos]=NULL; //ставим конец строки
  19. }
  20. strcpy(str,buffer); //копируем в первоначальную строку
  21. }
  22. int main()
  23. {
  24. int x;
  25. char* str[x];
  26. printf("\ninput number of strings\n");
  27. scanf("%d",x);
  28. for(int i=0;i<x;i++)
  29. {
  30. str[i]=sizeof(char[255]);
  31. }
  32. printf ("\nInput your surname, name and patronymic name\n");
  33. for (int i=0; i<x; i++)
  34. gets (str[i]);
  35. char a[]="ov",b[]="idze";
  36. char buffer[200];
  37. Replace(str,a,b,buffer);
  38. printf("%s",str);
  39. }
мне кажется, что я вообще что-то не то делаю и никак не могу разобраться. когда реализовываю функцию на обычной строке все работает, а как заставить это работать с массивом строк?

Решение задачи: «Массив строк: заменить все вхождения suf1 в строке на suf2»

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. size_t str_len(char* str)
  4. {
  5.     size_t count = 0;
  6.     while (*str++) count++;
  7.     return count;
  8. }
  9.  
  10. char* str_str(char* in, char* str)
  11. {
  12.     char *a, *b;
  13.     if (!*str)
  14.         return in;
  15.  
  16.     for (; *in; in++) {
  17.         if (*in != *str)
  18.             continue;
  19.  
  20.         a = in;
  21.         b = str;
  22.         while(1) {
  23.             if (!*b)
  24.                 return in;
  25.             if (*a++ != *b++)
  26.                 break;
  27.         }
  28.     }
  29.     return NULL;
  30.  
  31. }
  32. void str_rep(char* str, char* orig, char* rep)
  33. {
  34.     char *p1, *p2;
  35.     size_t len_rep = str_len(rep);
  36.     for (char* sub = str_str(str, orig); sub; sub = str_str(sub+len_rep, orig)) {
  37.         for (p1=orig, p2=rep; *p1; p1++)
  38.             *sub++ = *p2++;
  39.  
  40.         while (*p2) {
  41.             for (char* ptr=sub+str_len(sub); ptr >= sub; ptr--)
  42.                 *(ptr + 1) = *ptr;
  43.             *sub++ = *p2++;
  44.         }
  45.     }
  46. }
  47.  
  48. int main(void)
  49. {
  50.     char suff1[] = "ov";
  51.     char suff2[] = "aev";
  52.     char str[4][100] = {"Ivanov, Sidorov, Petrov."
  53.                       , "Petrov, Dorohov, Kluev, Baranov."
  54.                       , "Mishenko."
  55.                       , 0 };
  56.     for (size_t i=0; *str[i]; i++) {
  57.         str_rep(str[i], suff1, suff2);
  58.         puts(str[i]);
  59.     }
  60.     return 0;
  61. }

Объяснение кода листинга программы

  1. В функции str_len определяется длина строки.
  2. В функции str_str осуществляется поиск подстроки в строке.
  3. В функции str_rep происходит замена подстроки в строке.
  4. В функции main определяется массив строк и выполняется замена подстрок.
  5. Вывод на экран результата замены подстрок в каждой строке массива.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы