Замена символов в строке - 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); //Перемещаемся с начала в конец }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д