печатать одинаково расположенные элементы двумерного массива с помощью printf - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь напечатать двумерный массив, который имеет максимум 3 числа git, которые выровнены при печати. Например, для простого 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?

Ответы [ 4 ]

2 голосов
/ 20 марта 2020

Вы можете использовать префикс width , чтобы указать минимальную ширину для printf преобразований: printf("%4d", x); напечатает int переменную x, дополненную влево с достаточным количеством пробелов, чтобы получить по крайней мере 4 символа.

Если вы знаете максимальную ширину любого числа в массиве, вы можете жестко закодировать этот номер в строке формата. В противном случае вы можете вычислить требуемую ширину и использовать %*d и передать дополнительный аргумент для указания вычисленной ширины.

Вот измененная версия:

#include <stdio.h>

int main(void) {
#define M  3
#define 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 = 0;

    /* compute the required width */
    for (size_t i = 0; i < M; i++) {
        for (size_t j = 0; j < N; j++) {
            int w = snprintf(NULL, 0, "%d", a[i][j]);
            if (width < w) {
                width = w;
            }
        }
    }

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

    return 0;
}

Вывод:

[  0, 232,  20,  96, 176,   0,   0]
[  0,   0,  24,   0,   0, 176,   0]
[  0,   0,   0,   0,   0,   0,   0]
2 голосов
/ 20 марта 2020

Вот, пожалуйста.

#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]
1 голос
/ 20 марта 2020

используйте этот формат printf printf("%4d", arr[i][j]);

int main()
{
    int arr[3][7] = { {0, 232, 20, 96, 176, 0, 0}
    ,{0, 0, 24, 0, 0, 176, 0}
    ,{0, 0, 0, 0, 0, 0, 0} };
    for (int i = 0; i < 3; i++)
    {
        printf("[");
        for (int j = 0; j < 7; j++)
        {
            if (j < 6)
                printf("%4d,", arr[i][j]);
            if (j == 6)
                printf("%4d", arr[i][j]);

        }
        printf("]");
        printf("\n");
    }
}

PS: количество места может быть изменено по мере необходимости, с изменением "%4d".

0 голосов
/ 20 марта 2020
void printmat(const int **mat, size_t rows, size_t cols)
{
    for (size_t i = 0; i < rows; ++i) {
        printf("[ ");
        for (size_t j = 0; j < cols; ++j)
            printf("%3d%s", mat[i][j], j == cols-1 ? "" : ", ");
        printf("]\n");
    }
}
...