Массив строк: заменить все вхождения 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определяется массив строк и выполняется замена подстрок. - Вывод на экран результата замены подстрок в каждой строке массива.