【发布时间】:2016-12-08 15:09:42
【问题描述】:
我正在编写一个程序,它接收一个使用 A-I 而不是 1-9 的数独板并检查该板是否有效。 我从文件中读取了数独板,并使用开关将所有值更改为数字。
我的计划是使用 atoi 或 sscanf 将 2D char 数组转换为 2D int 数组,以便我可以添加所有行和列来检查它是否是有效的板。但是,当使用这些功能时,我会收到警告:
预期类型为 const char 但参数是 char 类型或传递参数 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);
}
【问题讨论】:
-
为什么不直接使用
int的二维数组并读入呢? -
@ameyCU 所以当我从文件中读取时,我如何将 A 到 I 字符直接更改为 1-9??
-
@samgak 嗯,这两种方法都不适合我,会导致奇怪的符号代替字母
-
C 保证字符是算术类型 和
0到9保证是连续的,所以'0' - '0' == 0,和'9' - '0' == 9,因此将数字字符转换为整数可以通过减去字符'0'或使用atoi来完成