2016-08-03 171 views
0

我正在編寫一個程序,該程序需要使用A-I而不是1-9的數獨板,並檢查該板是否有效。 我從文件中讀取數獨板,並使用開關將所有值更改爲數字。如何將2D字符數組轉換爲2D int int

我的計劃是使用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); 
} 
+1

爲什麼不直接使用int的二維數組讀入? – ameyCU

+0

@ameyCU所以當我從文件中讀取時,如何直接將A通過I字符更改爲1-9? – katDouglas

+0

@samgak嗯,這不是爲我工作兩種方法導致奇怪的符號代替字母 – katDouglas

回答

-1

相反轉換字母字符的字符數,我會做一個int類型的新的二維數組:

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

然後,您可以輕鬆查看總數組並檢查所有條目是否相等。

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); 
} 
+0

行:matsodoku [i] [j] =(int)(c -'A')+ 1,什麼是c? – katDouglas

+0

也必須對每個字母做這個,你在這裏的代碼是否只將A轉換爲一個?對不起,我有點困惑 – katDouglas

+0

這裏的代碼將文件中的任何字符轉換爲合適的編號 –

0

實在是沒有理由使用指針到指針到焦開始與當你可以讀取值直接進入int二維數組。雖然有很多方法可以解決這個問題,但堅持使用您的方法,您可以簡單地執行以下操作:從您的文件中讀取/驗證每個字符的值爲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; 
} 

讓我知道,如果您有任何疑問或問題(我沒有數據來檢驗)。