1

を実行するprint_puzzle(create_puzzle(input))と、出力の一番下に大量の gobbledegook が表示されますが、最後の行にのみ表示されます。なぜこれが起こり続けるのか、私にはわかりません。出力は、9 行の 9 つの数字であると想定されています (入力は、空のスペースを表すゼロを使用した数独パズルです)。

この一連のコードは、その入力を受け取り、文字列の 2 次元配列を作成し、print_puzzle を使用してそれらの文字列をグリッドに出力する必要があります。これらは文字列です。最終的には、正方形が取り得るすべての値を表示する方法を実装する予定だからです。しかし、今のところ、印刷すると、物事が台無しになります。81個​​の文字列すべてのすべての要素にnull値を入れてみましたが、文字列を印刷しようとすると、まだ台無しになります。道に迷いました!

typedef struct square {
  char vals[10]; // string of possible values
} square_t;

typedef struct puzzle {
  square_t squares[9][9];
} puzzle_t;

static puzzle_t *create_puzzle(unsigned char vals[9][9]) {
  puzzle_t puz;
  puzzle_t *p = &puz;
  int i, j, k, valnum;
  for (i = 0; i < 9; i++) {
    for (j = 0; j < 9; j++) {
      puz.squares[i][j].vals[0] = '\0';
      puz.squares[i][j].vals[1] = '\0';
      puz.squares[i][j].vals[2] = '\0';
      puz.squares[i][j].vals[3] = '\0';
      puz.squares[i][j].vals[4] = '\0';
      puz.squares[i][j].vals[5] = '\0';
      puz.squares[i][j].vals[6] = '\0';
      puz.squares[i][j].vals[7] = '\0';
      puz.squares[i][j].vals[8] = '\0';
      puz.squares[i][j].vals[9] = '\0';
      valnum = vals[i][j] -'0';
      for (k = 0; k < 10; k++){
        if ((char)(k + '0') == (char)(valnum + '0')){
          char tmpStr[2] = {(char)(valnum +'0'),'\0'};
          strcat(puz.squares[i][j].vals, tmpStr);
        }
      }
    }
  }
  return p;
}

void print_puzzle(puzzle_t *p) {
  int i, j;
  for (i=0; i<9; i++) {
    for (j=0; j<9; j++) {
      printf(" %2s", p->squares[i][j].vals);
    }
    printf("\n");
  }
}
4

4 に答える 4

1

functioncreate_puzzle()では、タイプ のポインタを返していますpuzzle_t。ただし、関数から戻るpuzと、型の変数のアドレスpuzzle_tは無効になります。

関数内で宣言された変数はローカル変数です。それらは、その関数内にあるステートメントでのみ使用できます。これらのローカル変数は、それ自体の外部の関数には認識されないため、ローカル変数のアドレスを返すことは意味がありません。関数が返されたときに、スタックで使用していたローカル ストレージがプログラムによって無効と見なされるためです。すぐにはクリアできません。論理的には、 at の値puzは不確定であり、アクセスすると未定義の動作が発生します。

puzグローバル変数を作成して、現在行っている方法で使用できます。

于 2015-10-14T09:36:15.593 に答える
0

ここでローカル変数を返しています:

return p;

関数の外側で宣言するpと、機能するはずです。puz

于 2015-10-14T09:37:33.133 に答える