Заменить в строке (mass) последовательность (simv) на 2 любые цифры - C (СИ)
Формулировка задачи:
Задание - заменить в строке(mass) последовательность (simv) на 2 любые цифры
Я пытаюсь пройтись по всей строке, запомнить номер символа, с которого начинается вхождение последовательности. Если такой символ есть, то присваиваю b и b+1 рандомные значения, а потом сдвигаю всю строку. Дальше проверяется ещё раз, этого вхождения уже нет, поэтому находит следующее.
Подскажите пожалуйста, как это нужно исправить?
char* random(char* mass, char*simv) { //srand(time(NULL)); - задаёт рандомно, но не число, а почему-то 2 символа( \a и т.п.). for (int i = 0; mass[i] != '\0'; i++) { int b = strstr(mass, simv) - mass + 1; //так можно? if (strstr(mass, simv) != NULL) { mass[b] = rand() % 10; mass[b + 1] = rand() % 10; int n = strlen(simv); int k = b; for (k; mass[k+n] != '\0'; ++k) mass[k + 2] = mass[k + n]; } } return mass; }
Решение задачи: «Заменить в строке (mass) последовательность (simv) на 2 любые цифры»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char buf[200] = {0}; const char * str = "shandge symbols by regexp"; const char * regexp = "by reg"; char * ptr = buf; int len = strlen(regexp); /* 3 copy of str into buf*/ memmove(buf, str, strlen(str)); memmove(buf + strlen(buf), str, strlen(str)); memmove(buf + strlen(buf), str, strlen(str)); while ((ptr = strstr(buf, regexp))) { /* тут внимательно. Не выйти за границы массива -- домашенее задание*/ memmove(ptr, ptr + len - 2, strlen(ptr)); *ptr++ = (rand() % 10) + '0'; *ptr++ = (rand() % 10) + '0'; } printf("%s\n", buf); return 0; }
Объяснение кода листинга программы
В этом коде заменяется подстрока simv
на две случайные цифры в строке mass
.
- Объявляются основные переменные: — buf — буфер для копирования исходной строки и для дальнейшей обработки; — str — исходная строка; — regexp — подстрока, которую необходимо заменить; — ptr — указатель на текущую позицию в строке; — len — длина подстроки, которую необходимо заменить.
- В цикле while осуществляется поиск первого вхождения подстроки
regexp
в строкеbuf
. - Так как в условии есть требование не выходить за границы массива, то перед смещением памяти, необходимо проверить, чтобы новое значение ptr не выходило за границы буфера.
- Далее происходит смещение памяти в буфере, начиная с указателя ptr, на величину len - 2 (так как необходимо заменить подстроку на две цифры, которые будут занимать 2 байта).
- В новую память записываются две случайные цифры, полученные с помощью функции rand() (от 0 до 9).
- После этого значение указателя ptr увеличивается на 2, чтобы перейти к следующей итерации цикла.
- В конце программы выводится измененная строка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д