Как записать символы в динамическом массиве не подряд? - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д