代码之家  ›  专栏  ›  技术社区  ›  Wizzardzz

在C中填充二维int数组的最简单方法[闭合]

  •  0
  • Wizzardzz  · 技术社区  · 7 年前

    我想编一个数独解算器。用户需要通过9个argv来初始化一个数独板,如下所示:

    ./a.out "9...7...." "2...9..53" ".6..124.." etc..
    

    我正在寻找一种用传递的参数填充此类数组的简单方法:

    int grille[9][9] = {
        {9,0,0,1,0,0,0,0,5},
        {0,0,5,0,9,0,2,0,1},
        {8,0,0,0,4,0,0,0,0},
        {0,0,0,0,8,0,0,0,0},
        {0,0,0,7,0,0,0,0,0},
        {0,0,0,0,2,6,0,0,9},
        {2,0,0,3,0,0,0,0,6},
        {0,0,0,2,0,0,9,0,0},
        {0,0,1,9,0,4,5,7,0}
    };
    

    malloc

    2 回复  |  直到 7 年前
        1
  •  2
  •   chqrlie    7 年前

    malloc 要分配网格,只需在 main 功能。您需要从命令行字符串参数初始化此对象。

    void init_row(int *row, const char *s) {
        int i;
        for (i = 0; i < 9; i++) {
            row[i] = 0;
        }
        if (s) {
            for (i = 0; i < 9 && s[i]; i++) {
                if (s[i] >= '1' && s[i] <= '9')
                    row[i] = s[i] - '0';
            }
        }
    }
    

    您可以这样初始化整个网格:

    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
        int grille[9][9];
        int i, j;
    
        /* initialize the grid */
        for (i = 0; i < 9; i++) {
            init_row(grille[i], i + 1 < argc ? argv[i + 1] : NULL);
        }
    
        /* output the grid */
        for (i = 0; i < 9; i++) {
            for (j = 0; j < 9; j++) {
                putchar(".123456789"[grille[i][j]]);
            }
            putchar('\n');
        }
        return 0;
    }
    
        2
  •  0
  •   melpomene    7 年前

    9...7.... 然后你就可以从字符串中逐字读出。

    for (i=0;i<9;i++)
      for (j=0;j<9;j++)
        {  
           if (argv[i+1][j]=='.') grille[i][j]=0;
           else grille[i][j]=argv[i+1][j]-'0';   //convert ascii value to number
        }
    

    这里的负“0”(ascii值48)是因为argv是字符串,字符“1”的代码是49,所以要在网格中获得1的值,应该将ascii代码转换为数字。。。--这些点被转换成“0”,因此它们被捕获并给出数字0 grille