Вернуть массивы и их размеры из void-функции - C (СИ)
Формулировка задачи:
Всем привет, я в этом деле новичок.
программа вылетает посредине.
в задании попрасили распечатать 2 массива в main, как мне передать в него 2 массива и 2 их размера.
и функция должна выглядеть именно так.
void func(int num,int *arr1, int *arr2)
заранее спасибо за помощь.
void func(int num,int *arr1, int *arr2)
{
int size=1
arr1=(int*)malloc(size* sizeof(int));
arr2=(int*)malloc(size* sizeof(int));
//разные изменения над массивами.
size++;
arr1=(int*)realloc(arr1, size*sizeof(int));
arr2=(int*)realloc(arr2, size*sizeof(int));
}
int main()
{
int num, *bigarr=NULL, *smallarr=NULL;
printf("input num: ",num);
scanf("%d",&num);
func(num,smallarr,bigarr);
printf("%d%d%d",smallarr[0],smallarr[1],bigarr[0]);Решение задачи: «Вернуть массивы и их размеры из void-функции»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void split(const int num, int** const smallDigitsPtr, int* const smallDigitsLengthPtr,
int** const bigDigitsPtr, int* const bigDigitsLengthPtr)
{
int temp = num;
int bigLength = 0;
int smallLength = 0;
int i = 0;
int j = 0;
int* big = NULL;
int* small = NULL;
/* counting digits */
while (temp > 0)
{
if ((temp % 10) >= 5)
{
bigLength++;
}
else
{
smallLength++;
}
temp = temp / 10;
}
/* special cases */
if (bigLength == 0)
{
bigLength = 1;
}
if (smallLength == 0)
{
smallLength = 1;
}
/* allocating memory */
big = malloc(bigLength * sizeof(*big));
small = malloc(smallLength * sizeof(*small));
memset(big, 0, bigLength * sizeof(*big));
memset(small, 0, smallLength * sizeof(*small));
/* writing digits into arrays */
i = bigLength - 1;
j = smallLength - 1;
temp = num;
while (temp > 0)
{
if ((temp % 10) >= 5)
{
big[i] = temp % 10;
i--;
}
else
{
small[j] = temp % 10;
j--;
}
temp = temp / 10;
}
/* exporting results */
(*bigDigitsPtr) = big;
(*smallDigitsPtr) = small;
(*bigDigitsLengthPtr) = bigLength;
(*smallDigitsLengthPtr) = smallLength;
}
int main(void)
{
int* big = NULL;
int* small = NULL;
int M = 0;
int N = 0;
int i = 0;
const int num = 380512;
split(num, &small, &M, &big, &N);
printf("%d --> big = ", num);
for (i = 0; i < N; i++)
{
printf("%d", big[i]);
}
printf(", small = ");
for (i = 0; i < M; i++)
{
printf("%d", small[i]);
}
printf("\n");
free(big);
free(small);
return 0;
}
Объяснение кода листинга программы
- В функции split(), код разделяет число на две части: большие цифры и маленькие цифры.
- Переменная
tempинициализируется значением входного числаnum. - Переменные
bigLengthиsmallLengthиспользуются для отслеживания количества больших и маленьких цифр соответственно. - Переменные
bigиsmallиспользуются для хранения больших и маленьких цифр соответственно. - Код проверяет каждую цифру числа
num, и если она больше или равна 5, то она считается большой цифрой и увеличивается значение переменнойbigLength. В противном случае, она считается маленькой цифрой и увеличивается значение переменнойsmallLength. - После прохождения всего числа
num, код проверяет, были ли найдены большие или маленькие цифры. Если нет, то переменнымbigLengthиsmallLengthприсваивается значение 1. - Код выделяет память для массивов
bigиsmallс помощью функции malloc(). - Затем, с помощью функции memset(), код очищает выделенную память, заполняя ее нулями.
- Код записывает цифры в массивы
bigиsmall, начиная с самых больших и заканчивая самыми маленькими. - Наконец, результаты работы функции split() экспортируются в функцию main().
- В функции main(), код вызывает функцию split() с входным числом
num. - Затем, код выводит на экран массивы
bigиsmall. - После вывода, память, выделенная для массивов
bigиsmall, освобождается с помощью функции free(). - Функция main() возвращает 0, что означает успешное выполнение программы.