Как напечатать «аккуратный» 2D массив в C - PullRequest
0 голосов
/ 30 октября 2019

Я могу распечатать 2D-массив в выходной файл, но он не является однородным. Я хотел бы, чтобы 2D-массив располагался равномерно при распечатке. Я довольно новичок в программировании на C, поэтому любая помощь будет принята с благодарностью!

Мой код:

#include <stdio.h>
#include <stdlib.h>

/**
 * Driver method for program
 */

int main()
{
    int nums[200];
    int i = 0;
    int j = 0;
    FILE * in_file;
    FILE * out_file;
    srand(time(0)); //seed for random generator

    /**
     * if loop reads text file and stores numbers into array
     */
    if (in_file = fopen("Data.txt", "r")) {
        while (fscanf(in_file, "%d", &nums[i]) != EOF) {
            i++;
        }

        int numbsinfile = i;
        int random = randomNumber(2, 12);

        int matrix1[5][random];
        int matrix2[random][5];
        out_file = fopen("out.txt", "w");

        fprintf(out_file, "Matrix 1: \n");
        fprintf(out_file, "Rows = 5 \n");
        fprintf(out_file, "Columns = %d \n\n", random);

        for(i = 0; i < 5; i++ ){
            for(j = 0; j < random; j++){
                int rand = randomNumber(0, numbsinfile);
                matrix1[i][j] = nums[rand];
                fprintf(out_file, "%d \t\t", matrix1[i][j]);
            }
            fprintf(out_file, "\n");
        }
        fclose(in_file);
        fclose(out_file);
    }

    return 0;

}

/**
 * Generates and prints random
 * numbers in range [lower, upper].
 */

int randomNumber(int lower, int upper) {

    int num = (rand() % (upper - lower + 1)) + lower;
    return num;

}

Входной файл, который я использую вместе с выходным файлом, который генерирует мой код. Я просто хочу очистить 2D-массив, который выводится в выходной файл.

входной файл:

23 34 -54 21 45 34 65 -54 21 45 34 65 -34 24 58
       49 45 10     -57 20
57 39 20    58 23 10 20 58 -60 76   -82 28
    28 -37 49 358 47 -50 37 29
57 -29 -20 47 69
    93 57   23 49 -38 49        27 -40 48 39
56 -30 47 28 49
37 49 
        27 26 10 20 58 -60 26 10 20 58 -60 76   -82 28
    28 -37 49 -28 93 28
73 47     27 83     37 -29 40 37 49 20
17 -26 12    17 17
18 38 29 39 -118
19 10 20 58 -60 76   -82 28
    28 -37 49 59 10 58 -60 76   -82 28
    28 -37 49 59 10 20 58 -60 76   -82 28
    28 -37 49 30 -58 58     38 49 30 -58 58     38 
49 30 -58 58    38 
28 39
39 48     23 -50 28
48 29 39 40 29

Мой выходной файл:

Matrix 1: 
Rows = 5 
Columns = 12 

28      39      20      49      58      76      37      -26         47      -40         216309856       26      
57      -50         30      47      29      58      73      20      26      216309856       49      26      
216309856       30      59      45      20      23      -50         83      -50         -37         28      30      
10      10      23      28      47      45      34      10      19      -38         -118        28      
47      49      -40         20      49      29      10      20      58      69      10      28      

1 Ответ

1 голос
/ 30 октября 2019

Как напечатать «аккуратный» двумерный массив в C (?)

Найти самый длинный текст ширину, используя snprintf(NULL, 0, some_format, ...

    int width = 1;
    for(i = 0; i < 5; i++ ) {
        for(j = 0; j < random; j++) {
            int rand = randomNumber(0, numbsinfile);
            matrix1[i][j] = nums[rand];
            int w = snprintf(NULL, 0, "%d", matrix1[i][j]);
            if (w > width) width = w;
        }
    }

Используйте * в спецификаторе и width для печати.

    for(i = 0; i < 5; i++ ) {
        for(j = 0; j < random; j++) {
            fprintf(out_file, " %*d", width, matrix1[i][j]);
        }
        fprintf(out_file, "\n");
    }
...