• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:質問です!><)

プログラムの質問について

このQ&Aのポイント
  • 行と列の座標を決定する部分の意味や動作について質問です。
  • fflush(stdin)の意味や目的について教えてください。
  • i++の意味や役割について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

(1) > c = getc(stdin); で、「文字」を一つ入力し、その番号をcに代入します。 > x = c - '0'; で「文字の番号」を対応する「数値」に変換しています。 ASCII準拠の文字コードだと、'0'から'9'まで番号が順番に並んでいるので、「数字の番号」-「'0'の番号」とすることで、数値0~9になります。 が、環境によっては「'0'から'9'まで順番に並んでいない」場合もあるので、常に使える手法ではありません。 strtol等の文字列→数値変換関数を使うのが確実です。 (2) 入出力には「バッファ」が用意されていて、1文字ずつではなく、ある程度まとめて読み書きするようになっています。 通常のファイル出力だと、一定文字溜るまでファイルには書き込みません。そのため、fprintf等で「出力」したのにファイルには書きこまれていない、という瞬間が存在します。 一般的なファイル出力だと、最終的に結果が書き込まれていれば問題は無いのですが、出力したらすぐに書き込んで欲しいときもあります(リアルタイムで逐次ログを出力したい、等)そんな時使うのが fflush です。 fflushはバッファに溜っている分を書き出して、バッファを空にします。 同様に、キー入力もバッファを持っています。押されたキーをある程度記録しておいて、読み出すタイミングで順番に処理されます。このような動作を「先行入力」とも呼ばれています。 PCが重くなったときにキー入力すると、既にキーは押してないのに、遅れて画面に文字が表示されることがあると思います。あれが先行入力によるものです。 ところが、このゲームのように、先行入力は必要なく、入力状態になった時点からの入力だけが欲しいケースもあります。先行入力のキャンセルが必要です。 そんな時には fflushで入力をキャンセルします...というのは半分嘘です。 Cの規格では、fflushを入力に対して行なったときの動作は「未定義」です。何が起るかわかりません。 あるC言語では、先行入力のキャンセルとして働きますが、他のC言語では何も起りません。致命的なエラーになる実装もあるでしょう。 そのC言語のマニュアルをよく読んで、fflushが先行入力キャンセルの動作をすることが確認できた場合に、そのC言語限定で使うようにする。 基本はこのケースでは使わない(別の手段でクリアする)のが正しい対応でしょう。 (3),(4)については、既に回答があるので省略。 ついでに。 > main() 型の省略は推奨できません。

stellaxxx
質問者

お礼

すごく丁寧にありがとうございました!>< とても分かりやすかったです!

その他の回答 (1)

回答No.1

そんなことより、まず、実行してみましょう。 画面、めちゃくちゃになりませんか? 配列のarray[*][こっち側]何も入っていませんよ? arrayをゼロクリアするなりの処理が必要です。 さて、(1)ですが、 これは数字を表している文字を、数値に変換しています。詳しくは、ASCIIコードを調べてみてください。ちなみに、せめて範囲チェックくらいはした方がいいと思います。 (2)は、いわゆる先行入力を読み捨ててるのだと思いますが、このプログラムでは、要らないんじゃないかな? (3)++はインクリメント演算子です。iはintですから、i=i+1だと思えばいいです。で、このiは、2で割った余りを見て、先攻か、後攻かを判断する変数のようですので、それをトグルしているだけですね。 (4)は、実装されていませんね。そもそも、これ、何ですか?どうなると勝つんですか?

stellaxxx
質問者

お礼

ご丁寧にありがとうございます!>< とても助かりました!

関連するQ&A