как убрать все нули в динамическом массиве?

есть у нас динамический массив n-го размера, мы его заполняем, но если в нем есть нули, то их убираем(передвинув на их место следующие элементы без нарушения порядка их следования), а после весь массив выводим. У самого не получилось. Есть в голове идея, сделать это с еще одним массивом и добавлять туда значения не равные 0, но изначально захотелось сделать компактнее(не считается одной из постановок задачи).

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
        setlocale(LC_ALL, "Rus");
        int* a;
        int i, k, n;
        printf("Введите размер массива: ");
        scanf_s("%d", &n);
        a = (int*)malloc(n * sizeof(int));
        for (i = 0; i < n; i++) {
            printf("a[%d]= ", i);
            scanf_s("%d", &a[i]);
        }
        for (i = 0; i <= n; i++) {
            if (a[i] == 0) {
                i++;
            }
            if (i > n) {
                printf("% d", a[i]);
                return 1;
            }
            printf("% d", a[i]);
        }
        free(a);
        return 0;
}

Ответы (1 шт):

Автор решения: citn

Окончательный вид программы:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
    setlocale(LC_ALL, "Rus");
    int* a;
    int i, k, n;
    printf("Введите размер массива: ");
    scanf("%d", &n);
    if (n == 0) {
        printf("Размер массива должен быть <0");
        return 1;
    }
    a = (int*)malloc(n * sizeof(int));
    for (i = 0; i < n; i++) {
        printf("a[%d]= ", i);
        scanf("%d", &a[i]);
    }
    size_t dst = 0; for (size_t src = 0; src < n; ++src) if (a[src] != 0) a[dst++] = a[src];
    for (size_t i = 0; i < dst; ++i) printf("%d ", a[i]);
    free(a);
    return 0;
}
→ Ссылка