Заменить в строке (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.

  1. Объявляются основные переменные: — buf — буфер для копирования исходной строки и для дальнейшей обработки; — str — исходная строка; — regexp — подстрока, которую необходимо заменить; — ptr — указатель на текущую позицию в строке; — len — длина подстроки, которую необходимо заменить.
  2. В цикле while осуществляется поиск первого вхождения подстроки regexp в строке buf.
  3. Так как в условии есть требование не выходить за границы массива, то перед смещением памяти, необходимо проверить, чтобы новое значение ptr не выходило за границы буфера.
  4. Далее происходит смещение памяти в буфере, начиная с указателя ptr, на величину len - 2 (так как необходимо заменить подстроку на две цифры, которые будут занимать 2 байта).
  5. В новую память записываются две случайные цифры, полученные с помощью функции rand() (от 0 до 9).
  6. После этого значение указателя ptr увеличивается на 2, чтобы перейти к следующей итерации цикла.
  7. В конце программы выводится измененная строка.

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


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

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

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