我正在编写一个程序,它接收一个使用A-I而不是1-9的数独板,并检查该板是否有效。 我从文件中读取了数独板,并使用开关将所有值更改为数字。
我的计划是使用atoi
或sscanf
将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);
}
答案 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;
}
然后,您可以轻松查看和数组并检查所有条目是否相等。