簡體   English   中英

如何在C中將2D char數組轉換為2D int

[英]How to convert a 2D char array to a 2D int in c

我正在編寫一個程序,該程序接收使用AI而不是1-9的數獨板,並檢查該板是否有效。 我從文件中讀取數獨板,然后使用開關將所有值更改為數字。

我的計划是使用atoisscanf將2D char數組轉換為2D int數組,以便我可以添加所有行和列以檢查其是否為有效板。 但是,使用這些功能時,我得到警告:

預期為const char類型,但參數為char類型或傳遞argumet,其中sscanf之一使指針從整數開始而無需強制轉換。

我對指針還是很困惑,所以idk這到底意味着什么。 是否有可能將我的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);
}

我更喜歡這種沒有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);
 }

當您可以將值直接讀取到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;
}

讓我知道您是否有任何疑問或問題(我沒有要測試的數據)。

與其將字母字符轉換為數字字符,不如創建一個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;
}

然后,您可以輕松瀏覽求和數組並檢查所有條目是否相等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM