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