Создание динамически размещаемой структуры с двумерной динамически размещаемой строкой

Я пытаюсь сканировать в сетке букв. cases количество буквенных сеток и r, c для количества строк и столбцов каждой сетки. Я подумал, что мог бы создать массив структур с 2D-массивами внутри. Я работаю над этим уже несколько часов, и это все еще доставляет мне проблемы:

  • Предупреждения:

    • Предупреждение C4477 (строка 12) - "scanf_s": строка формата "%s" требует аргумент типа "char*", но аргумент 1 переменной имеет тип "int"
    • Предупреждение C4473 (строка 12) - 'scanf_s': недостаточно аргументов для строки формата
  • Ошибки:

Код:

scanf_s("%d", &cases);
struct grid { 
    char **grid; 
};
struct grid *grids = (struct grid*)malloc(cases * sizeof(struct grid));

for (i = 0; i < cases; i++) {
    scanf_s("%d %d", &r, &c);
    grids[i].grid = (char**)malloc(sizeof(char*) * r);
    for (k = 0; k < r; k++) {
        grids[i].grid[k] = (char*)malloc(sizeof(char) * (c+1));
        scanf_s("%s", grids[i].grid[k], (c+1));
    }           
}

1 ответ

Мне пришлось немного подправить код в вопросе, а также добавить некоторые недостающие части (которые также должны были быть предоставлены, кстати), чтобы получить скомпилируемую (используя VStudio2010) часть.

main.c:

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


struct grid { 
    char **grid; 
};


int main() {
    int cases, r, c, k, i;
    struct grid *grids;

    scanf_s("%d", &cases);
    grids = (struct grid*)malloc(cases * sizeof(struct grid));

    for (i = 0; i < cases; i++) {
        scanf_s("%d %d", &r, &c);
        grids[i].grid = (char**)malloc(sizeof(char*) * r);
        for (k = 0; k < r; k++) {
            grids[i].grid[k] = (char*)malloc(sizeof(char) * (c + 1));
            scanf_s("%s", grids[i].grid[k], (c + 1));
        }           
    }
    return 0;
}

Примечания:

  • Вы компилировали код на C++ (как заметил @alk), и это полностью сбило вас с курса. Чтобы это исправить:
    • Установите для вашего файла расширение .c (и вы можете оставить значения по умолчанию для VStudio при компиляции; таким образом, он будет компилировать каждый исходный файл с использованием соответствующего компилятора на основе его расширения).
    • Явно скомпилируйте исходный файл как C. Вы можете установить это в свойствах проекта VStudio -> C/C++ -> Advanced -> Compile As и выбрать Compile as C Code. Для получения дополнительной информации посетите [MSDN]: /Tc, /Tp, /TC, /TP (указать тип исходного файла). Лично я считаю, что первый вариант более прост
  • Переместите объявления переменных перед любыми утверждениями (я думаю, что это могло быть кандидатом для установки компилятора C++). Это было ограничение для более старых стандартов C (я сомневаюсь, что оно все еще остается в силе), но (VStudio2010) C- компилятор по-прежнему применяет его (по крайней мере, по умолчанию)
Другие вопросы по тегам