所以目前我有一个能够读取包含9x9板的文本文件的工作代码,2D阵列中的每个插槽都是1-9之间的数字;但是,有些插槽会随机混入一个“ - ”字符。我发现我能够成功读取所有行然后打印它们的唯一方法是使用char sudoku[9][9]
,但这极大地影响了我当前作业的其他部分。
文件应该是连续9行,如下所示:
123-56-89
4561-3--9
等...
有人能告诉我一种方法,我可以成功地将文本文件内容扫描成INTEGER 2D数组而不是char数组吗?
int main(){
int i, j;
char sudoku[9][9];
char filename[100];
printf("Please enter file name (W/O .txt): ");
scanf("%s", filename);
FILE *file1 = fopen(filename, "r");
for(i=0;i<9;i++){
for(j=0;j<9;j++){
fscanf(file1,"%c\t", &sudoku[i][j]);
}
}
for(i=0;i<9;i++){
for(j=0;j<9;j++){
printf("%2c", sudoku[i][j]);
}
printf("\n");
}
fclose(file1);
}
答案 0 :(得分:2)
int suduku[9][9];
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
char c;
if (fscanf(file1, " %c", &c) != 1)
…report read failure and exit…
else if (isdigit((unsigned char)c))
sudoku[i][j] = c - '0';
else
sudoku[i][j] = 0;
}
}
将字符读入字符,然后转换为适当的整数。请注意,代码不关心矩阵中的每个字符是否与下一个字符分开十几个空白行,并且字符前面有20个空格,或者整个输入是单行上的81个字符,还是任何其他变体。只要文件中至少有81个非空格字符,就可以了。
答案 1 :(得分:0)
#include <stdlib.h>
/* ... */
int sudoku[9][9];
/* ... */
for(i = 0; i < 9; i++) {
for(j = 0; j < 9; j++) {
char s[] = "0";
fscanf(file1, " %c", &s[0]);
sudoku[i][j] = atoi(s);
}
}
我更喜欢在可能的情况下调用标准库函数来执行整数转换。在这里,我正在使用atoi()。如果它看到一个数字,它将返回其整数值。如果看到任何其他内容,包括' - '字符,它将返回0.如果fscanf()用完字符,atoi()也将返回0(因为我们在每次迭代中将s初始化为“0”),用' - '字符填充数组的其余部分。 (请注意,s在技术上是字符串而不是字符,因为这是atoi()期望的输入,但fscanf()只会覆盖存储字符的第一个字节。)