Массив строк: заменить все вхождения 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;
}

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

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

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


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

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

7   голосов , оценка 3.857 из 5
Похожие ответы