Массив строк: заменить все вхождения suf1 в строке на suf2 - C (СИ)
Формулировка задачи:
Задается массив строк. Каждая строка включает в себя Фамилию Имя Отчество.
Задается две строки (суффиксы) (например, "ov" "idze" или "chuk" "ko") suf1 и suf2. Заменяем все вхождения suf1 в фамилию на suf2.
Прим. в данной работе не пользоваться библиотечными функциями string.h.Все необходимые функции реализовывать вручную.
мне кажется, что я вообще что-то не то делаю и никак не могу разобраться. когда реализовываю функцию на обычной строке все работает, а как заставить это работать с массивом строк?
Листинг программы
- #include"stdio.h"
- void Replace(char str[],char a[],char b[],char buffer[])
- {
- int i,j,pos=0;
- for(i=0;str[i];i++)
- {
- for(j=0;str[i+j]&&a[j];j++) //начинается ли с i-ой позиции строка a
- if(str[i+j]!=a[j]) break;
- if(!a[j]) //если a[j]=0, то мы дошли до конца строки a
- {
- i+=j-1; //в j у нас длина стоки a, которую мы перепрыгиваем
- for(j=0;b[j];j++) buffer[pos++]=b[j]; //на место стоки a ставим строку b
- }
- else
- {
- buffer[pos++]=str[i]; //просто копируем символ
- }
- buffer[pos]=NULL; //ставим конец строки
- }
- strcpy(str,buffer); //копируем в первоначальную строку
- }
- int main()
- {
- int x;
- char* str[x];
- printf("\ninput number of strings\n");
- scanf("%d",x);
- for(int i=0;i<x;i++)
- {
- str[i]=sizeof(char[255]);
- }
- printf ("\nInput your surname, name and patronymic name\n");
- for (int i=0; i<x; i++)
- gets (str[i]);
- char a[]="ov",b[]="idze";
- char buffer[200];
- Replace(str,a,b,buffer);
- printf("%s",str);
- }
Решение задачи: «Массив строк: заменить все вхождения suf1 в строке на suf2»
textual
Листинг программы
- #include <stdio.h>
- size_t str_len(char* str)
- {
- size_t count = 0;
- while (*str++) count++;
- return count;
- }
- char* str_str(char* in, char* str)
- {
- char *a, *b;
- if (!*str)
- return in;
- for (; *in; in++) {
- if (*in != *str)
- continue;
- a = in;
- b = str;
- while(1) {
- if (!*b)
- return in;
- if (*a++ != *b++)
- break;
- }
- }
- return NULL;
- }
- void str_rep(char* str, char* orig, char* rep)
- {
- char *p1, *p2;
- size_t len_rep = str_len(rep);
- for (char* sub = str_str(str, orig); sub; sub = str_str(sub+len_rep, orig)) {
- for (p1=orig, p2=rep; *p1; p1++)
- *sub++ = *p2++;
- while (*p2) {
- for (char* ptr=sub+str_len(sub); ptr >= sub; ptr--)
- *(ptr + 1) = *ptr;
- *sub++ = *p2++;
- }
- }
- }
- int main(void)
- {
- char suff1[] = "ov";
- char suff2[] = "aev";
- char str[4][100] = {"Ivanov, Sidorov, Petrov."
- , "Petrov, Dorohov, Kluev, Baranov."
- , "Mishenko."
- , 0 };
- for (size_t i=0; *str[i]; i++) {
- str_rep(str[i], suff1, suff2);
- puts(str[i]);
- }
- return 0;
- }
Объяснение кода листинга программы
- В функции
str_len
определяется длина строки. - В функции
str_str
осуществляется поиск подстроки в строке. - В функции
str_rep
происходит замена подстроки в строке. - В функции
main
определяется массив строк и выполняется замена подстрок. - Вывод на экран результата замены подстрок в каждой строке массива.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д