数组移动左移固定位数

想用新建一个数组做中间变量,后按顺序输出数组,但运行结果不完全正确

#include 
#include 

int main()
{
    int n,p,i;
    //p为移动数目,n为数列个数;
    scanf("%d", &p);
    scanf("%d", &n);
    unsigned int a[n];

    for(i = 0;i < n;i++)
    {
        scanf("%d", &a[i]);
    }
    int q = p%n;
    unsigned int c[q];
    for(i = 0;i < p;i++)
    {
        c[i] = a[i];
        a[i] = a[p+i];
    }
    for(i = 0;i < n-q;i++)
    {
        printf("%d ",a[i]);
    }
    for(i = 0;i < q;i++)
    {
        printf("%d ",c[i]);
    }
    return 0;
}




int main()
{
    int n, p, i;
    // p为移动数目,n为数列个数;
    scanf("%d", &p);
    scanf("%d", &n);
    unsigned int a[n];

    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    int q = p % n;
    unsigned int c[q];
    for (i = 0; i < p; i++)
    {
        c[i] = a[i];
        // a[i] = a[p + i]; 这个操作后面执行
    }
    // 前移a[p]后面的元素
    for (i = 0; i < n - p; i++)
    {
        a[i] = a[i + p];
    }
    //把p前的放到a末尾
    for (i = 0; i < p; i++)
    {
        a[i + n - p] = c[i];
    }
    //
    for (i = 0; i < n; i++)
    {
        printf("%d ", a[i]);
    }
    // printf("\n");
    // for (i = 0; i < q; i++)
    // {
    //     printf("%d ", c[i]);
    // }
    return 0;
}