• 締切済み

プログラム(ループの挙動

void kamoku_touroku(void) { int t; printf("**** 科目登録 ****\n\n" ~~~~~~~~~~~~~~~~~~~~      \n"); for(t=0;t<1000;t++) { printf("科目名:"); gets(kamoku_list[t].name); if(kamoku_list[t].name[0] == '\0') //エンターキーのみが押された { printf("a");//ループ確認のために入れた出力 } else { printf("\n%sの情報を入力してください\n",kamoku_list[t].name); printf("[1]必修\n" "[2]選択必修\n" "[3]選択\n" "[4]自由\n" "単位の種類:"); scanf("%d",&kamoku_list[t].tanni_type); ~~~~~~~~~~~~~~~~~~~~~~~~ } } } 以上のプログラムを実行すると「科目名:a科目名:」と出てしまい 「gets」が無視されているように思うのですが原因がわかりません。 後、エンターキーのみの入力を受付けるようにするには何かいい方法はないでしょうか? 波線は関係ないところを省略してあります。

みんなの回答

  • P-mann
  • ベストアンサー率62% (56/89)
回答No.2

いえ。 fgetsでstdinから読み込めばgetsと同じように標準入力から取得できます。 /* 格納先変数 */ char hoge[256]; /* stdinは標準入力を表す */ fgets(hoge, sizeof(hoge), stdin); この辺りに書かれています。 http://homepage3.nifty.com/mmgames/c_guide/22-01.html ただし、入力した文字数がfgetsの第2引数よりも長い場合、 最初の問題と同じように読み残しが生じます。 ですので、読み捨てる処理というのが必要になってきます。 具体的には、読み出した文字列の中に改行文字が入っていない場合に 改行文字が現れるまで何度も読み捨てるという処理になります。

ism1369
質問者

お礼

色々と調べましたところこの問題は解決できました 有益なアドバイスありがとうございました

  • P-mann
  • ベストアンサー率62% (56/89)
回答No.1

原因は、scanfで改行文字を読み込まないせいです。 一回目の実行後、scanfにて数値を読み出していますが、その際に入力した改行文字を読み込んでいません。ですので、次のgetsでは必ず改行文字を読み込んでしまいます。 以下のページ内で「改行文字が残る」と検索すれば詳細が分かるかと思います。 http://www9.plala.or.jp/sgwr-t/c/sec05.html 回避方法も上記ページに書いてありますが、個人的にはscanfを使用しない実装に変更すべきであると考えます。 fgetsで取得し、それを数値に変換する方がいいと思われます。 また、getsは最大文字数を指定できないのでメモリ破壊の危険があります。fgetsの使用をお勧めします。

ism1369
質問者

お礼

返答ありがとうございます。 fgetsで取得するということは関数内でテキストファイルを 定義しないといけないと思うのですがその辺がいまいち よくわかりません。 ほかの関数内で定義しているテキストファイルを使用することは 可能なんでしょうか?