Замена символов в строке - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Известно, что в начале строки s находится не более 40 латинских букв, за которыми следуют пробелы. Образовать новую строку, предварительно заменив все вхождения ph на f, а все вхождения ed на ing.

Решение задачи: «Замена символов в строке»

textual
Листинг программы
//* Известно, что в начале строки s находится не более 40
*  латинских букв, за которыми следуют пробелы.
*  Образовать новую строку, предварительно заменив все
*  вхождения ph на f, а все вхождения ed на ing. */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct _repl {          // Структура для хранения информации
    int position;               // о позиции в строке ключевого слова
    int index;                  // и индекс пар.
}   replinfo;
 
replinfo searchReaplce(char * arr, const char ** toreplace);
void replace(char * arr, replinfo replaceinfo);
void arrShiftRight(char * arr, int position, int difference);
void arrShiftLeft(char * arr, int position, int difference);
 
/*Вводить текст сюда*/
char arr[] = "123 phillip eddy, philied,phed,edph phphedddy                        _";
 
#define TOREPLACE       3       //Количество пар для поиска и замены
 
                                //Указывать пары для поиска и замены
                                //следует с одинаковой очерёдностью в обоих указателях
                                //(у них должен быть одинаковый индекс)
 
const char *toreplace[] = {     //Ключевые слова для поиска
    "ph",       //#1
    "ed",       //#2
    "ingdy"       //#3
};
const char *replaceon[] = {     //Заменяющая часть
    "f",        //#1
    "ing",      //#2
    "THIS"         //#3
};
 
int main(void)
{
    replinfo replaceinfo;
    printf("len = %d\n%s\n", strlen(arr), arr);
    while(1)                                            //Искать бесконечно
    {
        replaceinfo = searchReaplce(arr, toreplace);    //Сохраняем информацию поиска в структуру replaceinfo
        if(replaceinfo.index == -1)                     //Если совпадений нет,
            break;                                      //выйдем из поиска
        replace(arr, replaceinfo);
    }
    char * output_arr = (char *)malloc(sizeof(char) * strlen(arr));
    strcpy(output_arr, arr);                                        //Запишем заранее подготовленный массив в новый
    printf("len = %d\n%s\n", strlen(output_arr), output_arr);
    return 0;
}
 
//Поиск ключевых слов toreplace для замены в строке arr
replinfo searchReaplce(char * arr, const char ** toreplace)
{
    replinfo tmp;
    int i, j, h, len;
    len = strlen(arr);
 
    for(i = 0; i < len; i++)                            //Считаем строку до конца
        for(j = 0; j < TOREPLACE; j++)                  //Перебираем варианты подбора
            if(*(arr+i) == *(*(toreplace + j) + 0))     //Если первые буквы из arr, toreplace совпали и одинаковы,
            {
                for(h = 0; *(*(toreplace + j) + h) != 0; h++)   //то продолжаем сверять ключевое слово со своей парой
                    if(*(arr+i++) != *(*(toreplace + j) + h))   //Если на пути встретится неравенство,
                        break;                                  //то прекратить сравнение
                if(*(*(toreplace + j) + h) == 0)                //Проверим, что сравнили правильно и дошли до конца образца
                {
                    tmp.position = i - h;                       //Вернём текущую позицию i - длинна замены h
                    tmp.index = j;                              //Вернём индекс пары j
                    return tmp;
                }
            }
    tmp.index = -1;
    tmp.position = -1;
    return tmp;         //Если ничего не найдено, то вернёт -1
}
 
//Заменяет в строке arr, слово с индексом replaceinfo.index на свою пару с тем-же индексом.
void replace(char * arr, replinfo replaceinfo)
{
    int replaceon_len = strlen(*(replaceon + replaceinfo.index));
    int toreplace_len = strlen(*(toreplace + replaceinfo.index));
 
    //Если заменяемый участок больше заменяющего участка
    if(toreplace_len < replaceon_len)
        arrShiftRight(arr, replaceinfo.position, replaceon_len - toreplace_len);    //Сдвигаем вправо на разность длинн
    else if(toreplace_len > replaceon_len)
        arrShiftLeft(arr, replaceinfo.position, toreplace_len - replaceon_len);     //Или вправо на разность длинн
 
    for(int i = 0; i < replaceon_len; i++)                                          //Дописываем на подготовленное место замену
        *(arr + replaceinfo.position + i) = *(*(replaceon + replaceinfo.index) + i);
}
 
//Сдвиг строки arr вправо с позиции position на длинну difference
void arrShiftRight(char * arr, int position, int difference)
{
    int len = strlen(arr);
    for(int i = 0; i < difference; i++)        //Кол-во подходов
        for(int j = len-1; j > position; j--)   //Сдвигаем строку до position на 1 символ
            *(arr + j) = *(arr + j - 1);        //Перемещаемся с конца, в начало. последний символ будет утерян.
}
 
//Сдвиг строки arr влево с позиции position на длинну difference
void arrShiftLeft(char * arr, int position, int difference)
{
    int len = strlen(arr);
    for(int i = 0; i < difference; i++)                     //Кол-во подходов.
        for(int j = 0; j + position < len; j++)             //Сдвигаем строку с position на 1 символ.
        *(arr + position + j) = *(arr + position + j + 1);  //Перемещаемся с начала в конец
}

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


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

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

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