如何在c中将2D char数组转换为2D int

时间:2016-08-03 04:24:20

标签: c char int scanf atoi

我正在编写一个程序,它接收一个使用A-I而不是1-9的数独板,并检查该板是否有效。 我从文件中读取了数独板,并使用开关将所有值更改为数字。

我的计划是使用atoisscanf将2D char数组转换为2D int数组,以便我可以添加所有行和列以检查它是否是有效的板。但是,当使用这些功能时,我会收到警告:

  

期望类型const char但是参数是char类型或者传递argumet sscanf中的一个从整数中生成指针而没有强制转换。

我仍然对指针很困惑,所以这真的意味着什么。甚至可以将我的2d char数组更改为2d int数组,如果是这样的任何建议?如果有更好的方法来检查董事会是否有效建议也将非常感谢。谢谢

int main() {
  int i, j;
  char **matsudoku = malloc(9*sizeof(char*));
  for (i=0; i<9; ++i)
    matsudoku[i]=malloc(9*sizeof(char));

  FILE *fpointer = fopen("C:/Users/Owner/Documents/Como Sci in C/sudokuchar.txt", "r");

  if (fpointer == NULL) {
    printf("Cannot open file \n");
    exit(0);
  }

  for(i=0; i<9; i++){
    for(j=0; j<9; j++){
       fscanf(fpointer, " %c", &matsudoku[i][j]);
       switch (matsudoku[i][j]){
           case 'A':
              matsudoku[i][j]='1';
              break;
           case 'B':
              matsudoku[i][j]='2';
              break;
           case 'C':
              matsudoku[i][j]='3';
              break;
           case 'D':
              matsudoku[i][j]='4';
              break;
           case 'E':
              matsudoku[i][j]='5';
              break;
           case 'F':
              matsudoku[i][j]='6';
              break;
           case 'G':
              matsudoku[i][j]='7';
              break;
           case 'H':
              matsudoku[i][j]='8';
              break;
           case 'I':
              matsudoku[i][j]='9';
              break;
         }
        printf("%c",matsudoku[i][j]);
    }

}
//atoi(matsudoku);
int k;
//or sscanf(matsudoku,"%d",%k);
fclose(fpointer);
}

3 个答案:

答案 0 :(得分:2)

我更喜欢没有atoi或switch / case的方法,而是非常直接地利用了ASCII表的本质。只需读入一个字符,然后减去'A'。因此,如果角色是'A',那么'A' - 'A'是0.但你的意思是这是“1”,因此,你在这里加1。

  int main() {
      int i, j;
      char nextchar;
      int **matsudoku = malloc(9*sizeof(int*));
      for (i=0; i<9; ++i)
        matsudoku[i]=malloc(9*sizeof(int));

      FILE *fpointer = fopen("C:/Users/Owner/Documents/Como Sci in C/sudokuchar.txt", "r");

      if (fpointer == NULL) {
        printf("Cannot open file \n");
        exit(0);
      }

      for(i=0; i<9; i++){
        for(j=0; j<9; j++){
          fscanf(fpointer, " %c", &nextchar);
          matsodoku[i][j] = (int)(nextchar-'A') + 1;
          printf("%d",matsudoku[i][j]);
      }

    }
    fclose(fpointer);
 }

答案 1 :(得分:0)

当您可以直接将值读取到int的2D数组中时,没有理由使用指向指针到指针的指针。虽然有很多方法可以解决这个问题,但坚持使用您的方法,您可以简单地执行以下操作...将文件中的每个字符读取/验证为tmp值,然后分配给matsudoku[i][j] = tmp - '0';一步完成角色转换。

将它们放在一起,你可以做类似以下的事情:

#include <stdio.h>
#include <stdlib.h>

#define SDKSZ 9

int main (void)
{
    int i, j;
    int matsudoku[SDKSZ][SDKSZ] = {{0}};

    FILE *fpointer =
        fopen ("C:/Users/Owner/Documents/Como Sci in C/sudokuchar.txt", "r");

    if (fpointer == NULL) {
        printf ("Cannot open file \n");
        exit (0);
    }

    for (i = 0; i < SDKSZ; i++)
        for (j = 0; j < SDKSZ; j++) {
            int tmp;
            if (fscanf(fpointer, " %d", &tmp) != 1) {   /* read/validate tmp */
                fprintf (stderr, "error: on read matsudoku[%d][%d]\n", i, j);
                exit (1);
            }
            matsudoku[i][j] = tmp - '0';  /* convert from ASCII to numeric */
        }
    fclose (fpointer);

    for (i = 0; i < SDKSZ; i++) {
        for (j = 0; j < SDKSZ; j++)
            printf (" %3d", matsudoku[i][j]);
        putchar ('\n');
    }

    return 0;
}

如果您有任何疑问或问题(我没有要测试的数据),请告诉我。

答案 2 :(得分:-1)

我没有将字母字符转换为数字字符,而是创建一个int类型的新2D数组:

int matSudokuInt[9][9];
for(i=0; i<9; i++)
{
    for(j=0; j<9; j++)
    {
        fscanf(fpointer, " %c", &matsudoku[i][j]);
        switch (matsudoku[i][j])
        {
            case 'A':
                matSudokuInt[i][j]=1;
                break;
            case 'B':
                matSudokuInt[i][j]=2;
                break;
            case 'C':
                matSudokuInt[i][j]=3;
                break;
            case 'D':
                matSudokuInt[i][j]=4;
                break;
            case 'E':
                matSudokuInt[i][j]=5;
                break;
            case 'F':
                matSudokuInt[i][j]=6;
                break;
            case 'G':
                matSudokuInt[i][j]=7;
                break;
            case 'H':
                matSudokuInt[i][j]=8;
                break;
            case 'I':
                matSudokuInt[i][j]=9;
                break;
        }
        printf("%d ", matSudokuInt[i][j]);
    }
    printf("\n");
}

然后很容易对行和列求和:

int sum = 0;
int rowSum[9];
int colSum[9];
// Let i be the column index and j be the row index
for (j = 0; j < 9; j++) {
    sum = 0;
    for (i = 0; i < 9; i++) {
        sum += matSudokuInt[i][j];
    }
    rowSum[j] = sum;
}

for (i = 0; i < 9; i++) {
    sum = 0;
    for (j = 0; j < 9; j++) {
        sum += matSudokuInt[i][j];
    }
    colSum[i] = sum;
}

然后,您可以轻松查看和数组并检查所有条目是否相等。

相关问题