关于顺时针打印数字程序的问题?

先上自己写的代码

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int limit;
    long count = 1;

    int k = 0;
    int b = 0;
    int j = 0;
    int c = 1;
    int e = 1;
    int f = 0;
    int h = 1;
    int m = 2;
    int p = 0;
    int n;

    printf("请输入矩形的边长:\n");
    scanf("%d",&limit);
    n = limit - 1;

    long canva[limit][limit];




    while(count != (limit * limit))
    {

        for(int i = j; i < limit - k; i++)//向右打印横行 
        {
            canva[j][i] = count++;
        }
        j++;
        k++;
        for(int a = c;a <= (n - b); a++)// 向下打印竖行 
        {
            canva[a][n-b] = count++;
        }
        c++;
        b++;

        for(int d = limit - e-1; d >=f ; d--)//反向打印横行 
        {
            canva[limit-e][d] = count++;
        }
        f++;
        e++;
        for(int g = limit - m; g >=h ; g--)//向上打印竖行 
        {
            canva[g][p] = count++;
        }
        h++;
        p++;
        m++;
    }
    for(int z = 0; z < limit; z++)//输出数组 
    {
        for(int v = 0; v < limit; v++)
        {
            printf("%5d",canva[z][v]);
            if( (v+1) % limit == 0)
            putchar('\n');
        }
    }

    putchar('\n');


    system("pause");



    return 0;
}

先不说这么写有多麻烦,我只想大神帮我看一下逻辑对不对,因为我在纸上
写了感觉是对的,但运行结果总不对,而且只有奇数才能跳出循环,输入偶数
的话就打印不出来
下面是运行结果
图片说明
这个是奇数
下一个输入偶数打印不出来,循环跳不出来
图片说明


#include <iostream>
#include <vector>

using namespace std;

void print_circle(vector< vector<int> > &arr,int a,int b,int c,int d)
{
    if (a == c)
    {
        for(int i=b;i<=d;i++)
            cout<<arr[a][i]<<" ";
    }
    else if(b == d)
    {
        for(int i=a;i<=c;i++)
            cout<<arr[i][b]<<" ";
    }
    else
    {
        int row = a;
        int column = b;
        while(column != d)
            cout<<arr[a][column++]<<" ";
        while(row != c)
            cout<<arr[row++][column]<<" ";
        while(column != b)
            cout<<arr[c][column--]<<" ";
        while(row != a)
            cout<<arr[row--][b]<<" ";
    }
}

int main()
{

    int m,n,temp;
    cin>>m>>n;
    vector< vector<int> > arr( m, vector<int>(n) );
    for(int i=0;i<arr.size();i++)
        for(int j=0;j<arr[0].size();j++)
        {
            cin>>temp;
            arr[i][j] = temp;
        }


    int a=0,b=0,c=m-1,d=n-1;
    while(a<=c && b<=d)
        print_circle(arr,a++,b++,c--,d--);

    system("pause");
    return 0;
}

这里的输出函数没有做好:
for(int z = 0; z < limit; z++)//输出数组
{
for(int v = 0; v < limit; v++)
{
printf("%5d",canva[z][v]);
if( (v+1) % limit == 0)
putchar('\n');
}
}