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