首页 > 解决方案 > 使用 printf 打印二维数组的等距元素

问题描述

我正在尝试打印一个 2d 数组,该数组最多有 3 个在打印时对齐的数字。例如,使用简单的printf,它看起来像这样:

[0, 232, 20, 96, 176, 0, 0]
[0, 0, 24, 0, 0, 176, 0]
[0, 0, 0, 0, 0, 0, 0]

我希望它打印时所有逗号都沿列对齐,并带有额外的空格,如下所示:

[   0, 232,  20,  96, 176,   0,   0]
[   0,   0,  24,   0,   0, 176,   0]
[   0,   0,   0,   0,   0,   0,   0]

我该怎么做printf

标签: cmultidimensional-arrayprintfconversion-specifier

解决方案


这个给你。

#include <stdio.h>

int main(void) 
{
    enum { M = 3, N = 7 };
    int a[M][N] =   
    {   
        { 0, 232, 20, 96, 176,   0, 0 },
        { 0,   0, 24,  0,   0, 176, 0 },
        { 0,   0,  0,  0,   0,   0, 0 }
    };

    int width = 4;

    for ( size_t i = 0; i < M; i++ )
    {
        putchar( '[' );
        for ( size_t j = 0; j < N; j++ )
        {
            if ( j != 0 ) putchar( ',' );
            printf( "%*d", width, a[i][j] );
        }
        printf( "]\n" );
    }

    putchar( '\n' );

    return 0;
}

程序输出为

[   0, 232,  20,  96, 176,   0,   0]
[   0,   0,  24,   0,   0, 176,   0]
[   0,   0,   0,   0,   0,   0,   0]

width例如,如果您想输出比由 3 位数字组成的值更大的值,您可以更改变量的值。那就是输出足够灵活。

如果要将数组输出放在单独的函数中,则如果编译器支持可变长度数组,则相应的函数可以如下所示。

#include <stdio.h>

void format_output( size_t m, size_t n, int a[m][n], int width )
{
    for ( size_t i = 0; i < m; i++ )
    {
        putchar( '[' );
        for ( size_t j = 0; j < n; j++ )
        {
            if ( j != 0 ) putchar( ',' );
            printf( "%*d", width, a[i][j] );
        }
        printf( "]\n" );
    }
}

int main(void) 
{
    enum { M = 3, N = 7 };
    int a[M][N] =   
    {   
        { 0, 232, 20, 96, 176,   0, 0 },
        { 0,   0, 24,  0,   0, 176, 0 },
        { 0,   0,  0,  0,   0,   0, 0 }
    };

    int width = 4;

    format_output( M, N, a, width );

    putchar( '\n' );

    return 0;
}

程序输出与上图相同,即

[   0, 232,  20,  96, 176,   0,   0]
[   0,   0,  24,   0,   0, 176,   0]
[   0,   0,   0,   0,   0,   0,   0]

推荐阅读