C 使用二维动态分配字符串创建动态分配的结构

C 使用二维动态分配字符串创建动态分配的结构,c,arrays,memory,struct,C,Arrays,Memory,Struct,我正试图扫描一排字母cases表示字母网格的数量,r,c表示每个网格的行数和列数。我想我可以创建一个包含2D数组的结构数组。我已经为此工作了几个小时,但它仍然给我带来问题: 警告: 警告C4477(第12行)-“scanfs”:格式字符串“%s”需要“char*”类型的参数,但变量参数1的类型为“int” 警告C4473(第12行)-“scanf_s”:为格式字符串传递的参数不足 错误: 守则: scanf_s("%d", &cases); struct grid {

我正试图扫描一排字母
cases
表示字母网格的数量,
r
c
表示每个网格的行数和列数。我想我可以创建一个包含2D数组的结构数组。我已经为此工作了几个小时,但它仍然给我带来问题:

  • 警告:

    • 警告C4477(第12行)-“scanfs”:格式字符串“%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));
    }           
}
scanf_s(“%d”和案例);
结构网格{
字符**网格;
};
结构网格*网格=(结构网格*)malloc(cases*sizeof(结构网格));
对于(i=0;i
我不得不稍微调整一下问题中的代码,还添加了一些缺少的部分(顺便说一句,这些部分也应该提供),以获得一个可编译的(使用VStudio2010)片段

main00.c:

#包括
#包括
结构网格{
字符**网格;
};
int main(){
int型,r,c,k,i;
结构网格*网格;
扫描单位(“%d”和案例);
网格=(结构网格*)malloc(案例*sizeof(结构网格));
对于(i=0;i
注释

    <>你编译代码为C++(如@ Alk注意到的),这就是完全让你偏离方向的原因。为了解决这一问题:
    • 将文件扩展名设置为.c(在编译时可以保留VStudio默认值;这样,它将根据扩展名使用适当的编译器编译每个源文件)
    • 显式地将源文件编译为C。您可以从VStudio项目属性->C/C++->高级->编译为,然后选择编译为C代码进行设置。有关更多信息,请访问。就我个人而言,我认为前一种选择更直接
    < L>在任意语句之前移动变量声明<强>(我想这可能是设置C++编译器的候选)。这是对旧的C标准的限制(我怀疑它是否仍然有效),但是(VStudio 2010)C编译器仍然强制执行它(至少在默认情况下)
@m.raynal:这没有问题。应该在发布的源代码中注明这些链接错误发生的确切位置,并且错误消息的全文应始终逐字包含在询问错误消息的问题中。发布您收到的任何错误消息,这样我们才能更好地理解这个问题。在我的Ubuntu系统中编译和运行时没有任何错误(当然,我用<代码> SCANFF()/代码>代替了代码> SCAFFX()/代码>”构造函数语法缺少形式参数“,这听起来很像C++。您确定使用的是C编译器吗?那么,第3行、第9行和第12行是什么-/谢谢你,克里斯蒂法蒂。这就是问题所在。当我把它切换到一个.c文件时,它确实运行了,但我遇到了一系列新的问题,没有显示任何新的错误和崩溃。它甚至不需要任何新的更改,所以我只切换到代码块。我认为我的知识还不足以解决VS问题。那么请您将答案标记为解决方案,这样就可以清楚地看出它解决了问题?