11.05.2016, 19:05
общий
это ответ
Здравствуйте, user8351!
Решение без встроенных строковых функций:
[code h=200]
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
void main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char s1[256], s2[256], s[256];
int i, j, iStart;
int s_len, s1_len, s2_len;
printf("Введите строку s: ");
gets(s);
printf("Введите строку s1: ");
gets(s1);
printf("Введите строку s2: ");
gets(s2);
s_len = strlen(s);
s1_len = strlen(s1);
s2_len = strlen(s2);
for(iStart=0; iStart<=s_len-s1_len; iStart++) //ищем, пока есть возможность для подстроки s1
{
for(i=iStart,j=0; j<s1_len; i++,j++) //ищем подстроку s1 в s, начиная с s[iStart]
{
if (s[i]!=s1[j])
break; //если есть хоть одно несовпадение, то выходим
}
if (j == s1_len) //дошли до конца подстроки s1 - она найдена!
{
j = s2_len-s1_len; //разность длин строк s1 и s2
if (j > 0) //если вставляемая строка больше найденной
{
for(i=s_len+j; i>iStart+j; i--) //то освобождаем место для j символов перезаписью оставшейся части строки s в конец
s[i] = s[i-j];
s_len += j; //корректируем и длину строки s
}
else if (j < 0) //если вставляемая строка меньше найденной
{
for(i=iStart+s1_len+j; i<s_len; i++)//то копируем хвост строки на |j| символов к началу
s[i] = s[i-j];
s_len += j; //корректируем и длину строки s (j<0 !!)
}
//если строки равны по длине, то дополнительные действия не требуются
for(i=0; i<s2_len; i++,iStart++) //осталось скопировать строку s2 в нужное место
s[iStart] = s2[i]; // одновременно корректируется и индекс iStart, с которого продолжится поиск вхождения строк
}
}
printf("Полученная строка: %s\n", s);
_getch();
}
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен