首页 文章

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

提问于
浏览
-1

我正在尝试用字母网格扫描 . cases 是字母网格的数量, rc 是每个网格的行数和列数 . 我想我可以用里面的2D数组创建一个结构数组 . 我还是给了我一些问题:

  • 警告:

  • 警告C4477(第12行) - 'scanf_s':格式字符串'%s'需要类型为'char *'的参数,但可变参数1的类型为'int'

  • 警告C4473(第12行) - 'scanf_s':没有为格式字符串传递足够的参数

  • 错误:

  • Compiler Error C2274

  • Compiler Error 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));
    }           
}

1 回答

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

    Notes

    • 您正在将代码编译为C(如@alk注意到的那样),这就是完全让您偏离正轨的原因 . 为了解决这个问题:

    • 将文件扩展名设置为 .c (您可以在编译时保留VStudio默认值;这样它将使用基于其扩展名的相应编译器编译每个源文件)

    • Explicitly 将源文件编译为C.您可以从VStudio项目属性 - > C / C - >高级 - >编译为,并选择编译为C代码 . 有关详细信息,请访问[MSDN]: /Tc, /Tp, /TC, /TP (Specify Source File Type) . 就个人而言,我认为前一种选择更为直接

    • 移动变量声明 before 任何语句(我认为这可能是设置C编译器的候选者) . 这是旧C标准的限制(我怀疑它仍然存在),但是(VStudio2010)C编译器仍然强制执行它(至少在默认情况下)

相关问题