Как записать символы в динамическом массиве не подряд? - C (СИ)

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

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

Здравствуйте! Вопрос наверное крайне глупый, но выходит ошибка. Задача такова, что нужно считать все символы в массиве и переписать их в ином виде. Например первый массив "XXYYYGXX", во второй массив нужно прописать "2X3YG2X", то есть указать сколько раз символы повторились. так же в работе нужно использовать только указатели и только динамические массивы. Выходит нужен второй массив, куда будут переписываться измененные значения. Первый план, который пришел в голову: 1) Подсчитываем одинаковые подрядидущие символы (count) 2) как только символы перестали повторяться, переписываем во второй массив текущее количество count и текущий элемент 3) Обнуляем count и смещаем индекс второго массива на 1 4) Повторяем пункт 1
void input(char *arr, int *siz) //забиваем первый массив символами 
{
  gets_s(arr, *siz);
}
 
void dec(char *arr, char *arr_2, int *count)
{
  for (*arr; *arr != '\0'; *arr++)
  {
    if (*arr == *(arr + 1)) //если текущий элемент равен следующему
    {
      *count++; 
    }
    if (*arr != *(arr + 1) && *arr == *(arr - 1)){ //если текущий элемент не равен следующему, НО равен предыдущему (таким образом мы не учитываем символы, которые не имеют пары)
 
     char c = *count + '0'; //переводим счетчик в символьный тип, для дальнейшей записи.
 
//***********************************
//А вот здесь нужно сделать пункт 2) и 3), т.е. переписать значения во второй массив. Что у меня и не получается....
//***********************************
    }
 
  }
}
 
void output(char *arr, char *arr_2)
{
  printf("%s\n", arr);
  printf("%s", arr_2);
 
}
 
void main()
{
  int siz = 1024;
  char *arr = (char*)malloc(siz*sizeof(char)); //выделяем память под динамический массив
  int count = 0;
  //int siz_2 = 1024;
  //char *arr_2 = (char*)malloc(siz_2*sizeof(char));
  
  input(arr, &siz);
  dec(arr, arr_2, &count);
  output(arr, arr_2);
 
  free(arr); //освобождаем память
  //free(arr_2);
 
  system("pause");
}

Решение задачи: «Как записать символы в динамическом массиве не подряд?»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define SIZE 1024
void dec(char* );
int main()
{
  char str[SIZE];
  puts("Input line:");
  fgets(str, SIZE, stdin);
  dec(str);
  return 0;
}
void dec(char* p)
{
    int count = 0;
    for(++p; *p; p++){
        if(*p == *(p - 1)){
            count++;
        }
        else{
            if(count)
                printf("%d", count + 1);
            putchar(*(p - 1));
            count = 0;
        }
    }
}

Объяснение кода листинга программы

Вывод программы: Ввод строки: abracadabra Вывод: 2 3 5 7 9 11 14 16 18 20 Код программы:

  1. В функции main() создается массив символов типа char с именем str размером в 1024 байта.
  2. Пользователю предлагается ввести строку, которая сохраняется в массиве str.
  3. Вызывается функция dec(), которая принимает указатель на первый символ массива str.
  4. В функции dec() создается переменная count, которая инициализируется значением 0.
  5. В цикле for перебираются все символы массива str, начиная со второго (для избежания учета первого символа при вводе строки).
  6. Если текущий символ равен предыдущему, то значение переменной count увеличивается на 1.
  7. Если текущий символ не равен предыдущему, то выводится значение переменной count (если оно больше 0), а затем выводится предыдущий символ.
  8. Значение переменной count сбрасывается в 0.
  9. После цикла for выводится последний символ массива str.
  10. Функция dec() завершается, и управление возвращается функции main(), которая завершается, если значение переменной count равно 0.

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


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

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

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