我试图从文件中获取 9x9 的数字网格并将其存储在 2D int 数组中。为此,我编写了代码,以便它使用文件中的 fgets() ,然后将 char 数组值转换为 int ,然后将其存储在数组中的相应位置。
虽然我认为它可以工作,但当我打印出数组时,我注意到它有重复的值(来自它读取的上一行),并且它没有打印出完整的 9x9 网格。这就是我的意思:
int strIndex = 1; // Goes every odd to extract number
/* Need to do this for the whole grid */
for(int i = 0; i < 9; i++) {
fgets(str,19, f);
strIndex = 1;
// printf("%s\n", str);
for(int j = 0; j < 9; j++) {
// Since asci digits start at 48, subtracting gets you the num
grid[i][j] = (int) str[strIndex] - 48;
strIndex = strIndex + 2;
}
}
这就是我应该得到的(基本上是 input.txt
中的任何内容):
8 2 7 1 5 4 3 9 6
9 6 5 3 2 7 1 4 8
3 4 1 6 8 9 7 5 2
5 9 3 4 6 8 2 7 1
4 7 2 5 1 3 6 8 9
6 1 8 9 7 2 4 3 5
7 8 6 2 3 5 9 1 4
1 5 4 7 9 6 8 2 3
2 3 9 8 4 1 5 6 7
但这就是我得到的:
8 2 7 1 5 4 3 9 6
-38 2 7 1 5 4 3 9 6
9 6 5 3 2 7 1 4 8
-38 6 5 3 2 7 1 4 8
3 4 1 6 8 9 7 5 2
-38 4 1 6 8 9 7 5 2
5 9 3 4 6 8 2 7 1
-38 9 3 4 6 8 2 7 1
4 7 2 5 1 3 6 8 9
我是否正确使用了fgets()
? -38 是什么?我似乎无法理解为什么打印的是它而不是实际的数字。 (例如:它不是从 grid[0][0]
中打印 8,而是在 grid[0][1]
中打印 -38。在 fgets
中code>,我创建了空格 19
,因为我注意到 fgets()
也接受空白,所以这就是为什么我的 strIndex
每 2 递增一次.
谢谢
最佳答案
fgets(str,19, f)
这不会读取整行。您的行有 19 个可见字符,但每行末尾有一个换行符 (\n
)。通过仅读取 19 个字符,您可以为下一个 fgets
留下换行符。因此,每第二个 fgets
调用都会读取一个换行符,并保留上一行的缓冲区的其余部分。换行符 ascii 值为 10
,这就是 -38
的来源,因为代码执行 str[strIndex] - 48
。
因此解决方法是读取 20
个字符而不是 19
。事实上,设置更大的缓冲区也没什么坏处。假设 32
字节。 fgets
无论如何都会停在换行符处。
关于c - 循环中的 fgets 重复二维数组中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60700451/