Создание динамически размещаемой структуры с двумерной динамически размещаемой строкой
Я пытаюсь сканировать в сетке букв. 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- компилятор по-прежнему применяет его (по крайней мере, по умолчанию)