0

我有类似 7 4 5 1 等的文件。我想把这些数字放在一个多维数组中。

for(x=0;x<9;x++)
       for(y=0;y<9;y++)
       {
         current=fgetc(fp);
         if(current!=EOF&current!=' '&current!='\n')
              sudokuArray[x][y] = current-'0';
       }

此代码无法正常工作。sudokuArray[0][0] 给出结果为真(文件中的第一个数字),但 [0][1] 给出了一些随机数,如 131231304。[0][2] 给出了 [0][1] 应该是什么。这是为什么?

4

3 回答 3

1

我不确定你为什么使用嵌套循环从文件中读取。我在您的代码中看到一个问题:

改成 &&:

     if(current!=EOF&current!=' '&current!='\n')

到:

 if(current!=EOF && current!=' ' && current!='\n')

&&是逻辑AND并且&是按位与。

因为,你只有整数,你似乎知道确切的数字。整数。您可以简单地使用fscanf

fscanf(fp, "%d", &arr[x][y]);
于 2012-06-07T12:11:21.810 回答
1

这是因为如果你的内部循环:

for(y=0;y<9;y++)
{
    current=fgetc(fp);
    if((current!=EOF) && (current!=' ') && (current!='\n'))
        sudokuArray[x][y] = current-'0';
}

如果您的输入是7 4 5 1,那么当y == 0您阅读时'7',它会被输入sudokuArray[0][0]

现在在你的下一个循环中y == 1,你读到' '. 由于您的if陈述,您没有将其放入sudokuArray y仍会增加

下次您执行循环时y == 2,您阅读'4'并放入sudokuArray[0][2].

确实可以正常工作,fgetc()并且您的代码完全按照您的要求执行。这样代码就很听话了。

编辑:还要注意您的if语句应该包含&&而不是&. 他们是不同的运营商。一些空格和一些括号也使代码更易于阅读和维护。

于 2012-06-07T12:13:13.850 回答
0

在您的循环中,您忽略了字符 - 但是即使您没有填充相关的数组元素,您也会增加索引。尝试重新实现为:

#include <stdlib.h>

for(x=0;x<9;x++)
    for(y=0;y<9;y++)
      {
      /* Get next character */

      current=fgetc(fp);

      /* Loop, retrieving additional chars, until either EOF is hit or 
         you find a non-whitespace character */

      while(current != EOF && iswhite(current))
        current = fgetc(fp);

      if(current != EOF)
        sudokuArray[x][y] = current - '0';
      }

另外 - 你想检查current != EOF,还是应该这样!feof(fp)

分享和享受。

于 2012-06-07T12:11:46.787 回答