Заменить в строке (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, чтобы перейти к следующей итерации цикла.
- В конце программы выводится измененная строка.