c - 循环中的 fgets 重复二维数组中的数据

标签 c arrays string

我试图从文件中获取 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/

相关文章:

python/numpy ValueError : Expected 1D or 2D array, 得到了 0D 数组

java string.replace 使用方法运行太慢

c++ - 输入 1024 后十进制到二进制转换的错误输出?

c - MSP430 Timer_A - 寄存器的比例

java - 复制数组每隔一个字节的最快方法

python - 如何用Python将用户输入转换为列表?

c - 两种不同的交换功能之间有什么区别?

Android NDK/JNI UnsatisfiedLinkError With .So library

c# - 如何在 C# 中创建唯一的随机字符序列?

java - 替换所有特殊字符、数字和字母