Консультация № 189342
11.05.2016, 15:14
0.00 руб.
0 1 1
Уважаемые эксперты! Пожалуйста, помогите! Возникли трудности касательно решения задачи:
Даны строки S, S1 и S2. Заменить в строке S все вхождения строки S1 на строку S2.
Заранее спасибо за помощь.


Приложение:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
void main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char s1[256], s2[256], s[256];
char *buf;
unsigned int i;

printf("Введите строку s: ");
gets(s);
printf("Введите строку s1: ");
gets(s1);
printf("Введите строку s2: ");
gets(s2);
i=strlen(s)-strlen(s1)+1; //сравнение строк
if (i>0)
{
strrev(s);
strrev(s1);
strrev(s2);
buf = strstr(s, s1);
if(buf) //условие наличия подстроки
{
strcpy(buf,buf+strlen(s1));//удаление последней подстроки
memmove(buf,s2,strlen(s2));
strrev(s);
}
else
strrev(s);
printf("%s\n", s); //вывод результата
}
else
printf ("\n Строка s1 больше строки s");
_getch();
}

Обсуждение

давно
Посетитель
7438
7205
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]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа