Поиск и замена в строке items подстрок subStr на fStr - C (СИ)
Формулировка задачи:
#include <iostream>
/*Поиск и замена в строке items подстрок subStr на fStr
и возвращение указателя на новую строку.*/
char* Replace(char* items, char* subStr, char* fStr)
{
size_t count = 0; //Счетчик для посчета совпадений в строке.
char *p1, *p2; //Временные указатели (для копирования строк).
char* newStr; //Указатель на новую строку.
for (size_t i = 0; items[i]; i++)
{
//Выставить указатели на начало входящей строки и новой строки.
p1 = &items[i];
p2 = subStr;
//Сравниваем заменяемую последовательность с заменяемой.
while(*p2 && *p2 == *p1)
{
p1++;
p2++;
}
//Инкремент счетчика совпадений.
if (!*p2) count++;
}
//Выделяем новый блок памяти для новой строки.
size_t newLength = \
(strlen(items) - strlen(subStr) * count) + strlen(fStr) * count + 1;
newStr = (char*)malloc(newLength * sizeof(char));
memset(newStr, '\0', newLength);
//count теперь указывает на индекс в новой строке.
count = 0;
for (size_t i = 0; items[i]; i++)
{
p1 = &items[i];
p2 = subStr;
while(*p2 && *p2 == *p1)
{
p1++;
p2++;
}
/*Если не нашло совпадение копирует сивол входящей строки
в новою строку. Если нашло совпадение копирует заменяющую
(fStr) строку в конец новой(newStr) строки*/
if (!*p2)
{
p1 = &newStr[count];
p2 = fStr;
while(*p2)
{
*p1++ = *p2++;
count++;
}
i += strlen(subStr) - 1;
}
else
{
p1 = &items[i];
p2 = &newStr[count];
*p2 = *p1;
count++;
}
}
return newStr;
}Решение задачи: «Поиск и замена в строке items подстрок subStr на fStr»
textual
Листинг программы
/* ANSI C 99 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * replace_substring(char * restrict str, const char * restrict sub, const char * restrict repl, const size_t maxlen) {
char buf[maxlen], * pStr, *pBuf;
size_t subLen, replLen;
memset(buf, '\0', maxlen);
subLen = strlen(sub);
replLen = strlen(repl);
pBuf = buf;
pStr = str;
while ( *pStr ) {
if ( maxlen - ( pBuf - buf ) == 1 )
break;
else if ( strncmp(pStr, sub, subLen) )
*pBuf++ = *pStr++;
else {
if ( pBuf - buf + replLen > maxlen - 1 )
break;
strcpy(pBuf, repl);
pBuf += replLen;
pStr += subLen;
}
}
return strcpy(str, buf);
}
/**************************************/
typedef char string_t[256];
#define get_string(s) ( scanf("%255[^\n]%*c", (s)) == 1 )
int main(void) {
string_t str, sub, repl;
while ( printf("String: ") && get_string(str) &&
printf("Substring: ") && get_string(sub) &&
printf("Replacment: ") && get_string(repl)
)
printf("Result: %s\n", replace_substring(str, sub, repl, sizeof(string_t)));
return 0;
}
Объяснение кода листинга программы
- Код реализует функцию
replace_substring, которая выполняет поиск и замену подстроки в строке. - В функции используется буфер
bufдля хранения результата. - Переменная
maxlenуказывает максимально допустимую длину результата. - Переменная
subсодержит подстроку, которую необходимо найти. - Переменная
replсодержит подстроку, на которую необходимо заменить найденную подстроку. - Переменная
pBufуказывает на текущий символ в буфереbuf. - Переменная
pStrуказывает на текущий символ в исходной строке. - В цикле
whileпроисходит сравнение каждого символа исходной строки с подстрокойsub. - Если символы совпадают, то текущий символ подстроки
replкопируется в буферbuf. - Если длина результата превышает
maxlen, то функция возвращает исходную строку без изменений. - В основной функции
mainиспользуются массивыstr,subиreplдля хранения введенных пользователем строк. - В цикле
whileпроисходит считывание строк от пользователя и вызов функцииreplace_substringдля их обработки. - Результат замены выводится на экран.
- Цикл продолжается до тех пор, пока пользователь не введет пустую строку.