使用2D动态分配的字符串创建动态分配的结构

我正在尝试用字母网格扫描。 cases是字母网格的数量, rc是每个网格的行数和列数。 我想我可以用里面的2D数组创建一个结构数组。 我已经在这个工作了几个小时了,它仍然给我带来问题:

  • 警告:

    • 警告C4477 (第12行) – ‘scanf_s’:格式字符串’%s’需要类型为’char *’的参数,但可变参数1的类型为’int’
    • 警告C4473 (第12行) – ‘scanf_s’:没有为格式字符串传递足够的参数
  • 错误:

    • 编译器错误C2274

    • 编译器错误C2461

代码:

 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)); } } 

我不得不在问题中稍微调整一下代码,同时添加一些缺少的部分(应该也提供,顺便提一下 ),以获得可编译的(使用VStudio2010 )。

main.c

 #include  #include  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 ++ - >高级 - >编译为 ,并选择编译为C代码 。 有关详细信息,请访问[MSDN]:/ Tc,/ Tp,/ TC,/ TP(指定源文件类型) 。 就个人而言,我认为前一种选择更为直接
  • 任何语句之前移动变量声明(我认为这可能是设置C ++编译器的候选者)。 这是旧C标准的限制(我怀疑它仍然存在),但是( VStudio2010C编译器仍然强制执行它(至少在默认情况下)