Как записать символы в динамическом массиве не подряд? - 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.