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

时间:2017-01-29 08:18:03

标签: c arrays memory struct

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

  • 警告:

    • 警告C4477 (第12行) - 'scanf_s':格式字符串'%s'需要类型为'char *'的参数,但可变参数1的类型为'int'< / em>的
    • 警告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 个答案:

答案 0 :(得分:0)

我不得不在问题中调整一些代码,同时添加一些缺少的部分(应该也提供,顺便提一下),以获得可编辑的(使用 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 ++ - &gt;高级 - &gt;编译为,并选择编译为C代码。有关详细信息,请访问[MSDN]: /Tc, /Tp, /TC, /TP (Specify Source File Type)。就个人而言,我认为前一种选择更为直接
  • 任何语句之前移动变量声明(我认为这可能是设置 C ++ 编译器的候选者)。这是旧的 C 标准的限制(我怀疑它仍然存在),但是( VStudio2010 C 编译器仍然强制执行它(至少默认情况下)