[英]How to convert a 2D char array to a 2D int in c
我正在編寫一個程序,該程序接收使用AI而不是1-9的數獨板,並檢查該板是否有效。 我從文件中讀取數獨板,然后使用開關將所有值更改為數字。
我的計划是使用atoi
或sscanf
將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.