Как записать символы в динамическом массиве не подряд? - 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
Код программы:
- В функции main() создается массив символов типа char с именем str размером в 1024 байта.
- Пользователю предлагается ввести строку, которая сохраняется в массиве str.
- Вызывается функция dec(), которая принимает указатель на первый символ массива str.
- В функции dec() создается переменная count, которая инициализируется значением 0.
- В цикле for перебираются все символы массива str, начиная со второго (для избежания учета первого символа при вводе строки).
- Если текущий символ равен предыдущему, то значение переменной count увеличивается на 1.
- Если текущий символ не равен предыдущему, то выводится значение переменной count (если оно больше 0), а затем выводится предыдущий символ.
- Значение переменной count сбрасывается в 0.
- После цикла for выводится последний символ массива str.
- Функция dec() завершается, и управление возвращается функции main(), которая завершается, если значение переменной count равно 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д