• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:gets関数と構造体について)

gets関数と構造体についての質問-プログラムの入力部分で問題が発生

このQ&Aのポイント
  • C言語のプログラムで、gets関数と構造体を使用して名前と点数を入力するプログラムを作成しています。
  • しかし、点数を入力するときにscanf関数を使用すると、入力の終了がスキップされてしまいます。
  • また、入力終了を示すend変数をjに置き換えると、入力はできるもののデータの表示がエラーとなってしまいます。

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

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

まず。 scanfとかgetsとかで「キーボード」から入力、と習ったかと思いますが、正確には違います。 「標準入力」からの入力です。 この標準入力が、端末からの入力に割り当てられているので「キーボードからの入力」に見えるのです。 gets等が実行された時点でキー入力を受け付けるわけではなく、 端末は端末で勝手にキー入力を受け付け送信してくるし、 受け取ったOS側もOS側で、勝手に蓄えておいて、要求されたら要求されただけの文字を送ります。 国語 : と表示されたから 95リターン と入力したら、次へ実行が移った ...かのように見えますが、実際は、入力(gets,scanf)が実行された時点で、「溜め込んだ入力が無い」ので「入力が溜るまで待っていた」ためで。 逆に言えば、「溜め込んだ入力」が既にあるのなら、それから読み出され、キーボード入力など待たないのです。 scanf("%d",tensu[i].kokugo); では、数値だけを読み込みます。 数値を入力するとき 95リターン というようにキーを入力しているかと思います。 scanf("%d"では、数値だけしか読み込まないので、「95」だけが読み込まれ、「リターン」は「溜め込んだ入力」に残ったままになります。 続いてscanf("%d",tensu[i].rika); とすると あなたは「87リターン」と入力したつもりかもしれませんが、プログラムは (残っている)リターン87 までを読み込み、その後のリターンは残ったままです。 gets(end)ですが、getsはリターンまでを読み込みます。 ここで、先程のリターンが残っているので、その(残っている)リターンを読み込み、getsの処理は終了です。 この場所でキーボード入力を待つ必要なく、getsを終了させることができます。 ・溜め込んだ物を使わないようにする ・scanfを使わない ・endの 入力内容をatoiに頼らずに、ちゃんと値が入っているか確認する 等、対処方法はたくさんあります。 なお、 scanf("%d",tensu[i].kokugo); はコンパイル時にエラーにはなりませんが、実行時に問題になります。

eternidad_beyer
質問者

お礼

なるほど、scanfとgetsにはそういう違いがあるのですね。 入力が溜まるというのは以前参考書で読みましたが、よく分からなかったので覚えていませんでした… ありがとうございます。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

ついでだけど, 今さら gets もなんだかなぁと思う.

  • usa3usa
  • ベストアンサー率33% (20/59)
回答No.3

2点、scanfの使い方に、勘違いがありそうです。 ・scanfでは、格納場所のポインタを指定しますので、 scanf("%d",tensu[i].kokugo); → scanf("%d",&tensu[i].kokugo); ですね。 ・scanfでは、改行文字が残ること、忘れていませんか? http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-3

参考URL:
http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-3
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

実行して検証はしていませんが… >scanf("%d",tensu[i].kokugo); コールした時、tensu[i].kokugoには何が入っているんでしょうか? ちゃんと「tensu[i].kokugoのアドレス」を値として入れましたか? # まぁ普通はそんなコトしませんけど。 # int型の変数に自分自身のアドレスを予め入れておく。なんてことは。 gets()とsacnf()併用すると、入力ストリームの状態どうなるんでしたっけかね? # http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1442167359

関連するQ&A