Поиск и замена в строке 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;
}

Объяснение кода листинга программы

  1. Код реализует функцию replace_substring, которая выполняет поиск и замену подстроки в строке.
  2. В функции используется буфер buf для хранения результата.
  3. Переменная maxlen указывает максимально допустимую длину результата.
  4. Переменная sub содержит подстроку, которую необходимо найти.
  5. Переменная repl содержит подстроку, на которую необходимо заменить найденную подстроку.
  6. Переменная pBuf указывает на текущий символ в буфере buf.
  7. Переменная pStr указывает на текущий символ в исходной строке.
  8. В цикле while происходит сравнение каждого символа исходной строки с подстрокой sub.
  9. Если символы совпадают, то текущий символ подстроки repl копируется в буфер buf.
  10. Если длина результата превышает maxlen, то функция возвращает исходную строку без изменений.
  11. В основной функции main используются массивы str, sub и repl для хранения введенных пользователем строк.
  12. В цикле while происходит считывание строк от пользователя и вызов функции replace_substring для их обработки.
  13. Результат замены выводится на экран.
  14. Цикл продолжается до тех пор, пока пользователь не введет пустую строку.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5
Похожие ответы