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] は結果 true (ファイルの最初の数字) を返しますが、[0][1] は 131231304 のような乱数を返します。何故ですか?

4

3 に答える 3

1

ネストされたループを使用してファイルから読み取る理由がわかりません。コードに1つの問題があります。

への変更 &&:

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

に:

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

&&は論理積ANDであり、&ビット単位の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 に答える