Проблема сканирования целых чисел с запятой между ними в 2d массив - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь написать программу на C, которая принимает 2d матрицу в форме axb: {{a, b, c}, {d, e, f} ...}, где a определяет количество строк иb определяет количество столбцов, субъединицы {}, объявляющие строки, и элементы строк объявляются как a, b, c ... между {}. Проблема в том, что программа принимает только матрицы без запятых между элементами, поэтому работают только матрицы в формате axb: {{abc}, {def} ...}}. Я хочу, чтобы программа могла принимать ввод с запятыми между переменными. Вот код для справки:

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

int main() {
    int a,b;
    scanf("%dx%d:{", &a, &b);
    int matrix[a][b];
    int r,c;
    for (r = 0; r < a; r++) {
        scanf("{%d", &matrix[r][0]);
        for(c = 1; c < (b -1); c++) {
            scanf("%d", &matrix[r][c]);
        }
        scanf("%d},", &matrix[r][c]); 
    }
    printf("%dx%d:{", b, a);
    for (c = 0; c < (b - 1); c++) {
        printf("{");
        for(r = 0; r < (a - 1); r++) {
            printf("%d,",matrix[r][c]);
        }
        printf("%d",matrix[r][c]);
        printf("},");
    }
    printf("{");
    for(r = 0; r < 3; r++) { 
        printf("%d,",matrix[r][c]);
    }
    printf("%d",matrix[r][c]);
    printf("}");
    printf("}\n");
    return 0;
}

1 Ответ

0 голосов
/ 06 октября 2019

Что бы я сделал, это просканировал весь ввод и поработал с этим потом.

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


int main()
{
    // scan the input matrix
    int a, b;
    char input[256];
    scanf("%dx%d:%256[^\n]", &a, &b, input);

    int mat[a][b];

    // populate matrix:
    char* p = input;
    int i = 0;
    while (p != input + 256)
    {
        // scan until the character is not a separator
        if (*p == '{' || *p == '}' || *p == ',')
        {
            ++p;
        }
        else
        {
            int n;
            sscanf(p, "%d", &n);
            mat[0][i] = n;
            ++i;

            // scan until we find a separator character
            while (p != input + 256 && (*p != '{' && *p != '}' && *p != ','))
            {
                ++p;
            }

            if (i >= a*b)
                break;
        }
    }
    printf("your matrix:\n");
    for (i = 0; i < a*b; ++i)
    {
        if (i % b == 0)
            printf("\n");

        printf("%d ", mat[0][i]);
    }
    printf("\n");

    return 0;
}

Пример ввода и вывода:

Вход:
3x2:{{a, b},{c, d},{e, f}}

Вывод:

a b
c d
e f

, где a, b, c, d, e и f - числа (ну, целые числа).

Однако это может быть не элегантным решением, но оно делает то, о чем вы просили.
По крайней мере, оно может дать вам некоторые идеи. Надеюсь, что это может помочь.

Примечание:
При индексации массива я использовал один индекс i. Вы можете сделать это, потому что подобные массивы все равно хранятся в одномерном массиве. Однако это только моя лень. Не стесняйтесь исправлять это.



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

...