• ベストアンサー

scanf と gets について

以下のプログラムを見てください。 char filename[20]; gets(filename); if((fp = fopen(filename, "r") == NULL) { -------- -------- } もうひとつはこれです。 char filename[20]; scanf("%s", filename); if((fp = fopen(filename, "r") == NULL) { -------- -------- } 上では実行できましたが、下ではダメでした。 なにか初歩的なミスをしてるようなんですが、わかりません。 教えていただきたいのですが。

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

  • ベストアンサー
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.2

#include <stdio.h> main(){ char filename[20]; gets(filename); printf("[%s]\n",filename); scanf("%s", filename); printf("[%s]\n",filename); } ------------------------------------------------------------ というプログラムを実行してみれば,動作の違いはわかるはずです. エラーが起きて,原因がよくわからなかったら, プリント文を埋め込むなりして, よく確認しましょう.

その他の回答 (3)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.4

scanfを実行毎にfflush(stdin)を実行することで解決しませんか? yokoyariさんのいわれてるようにscanfでは読みとった部分以外の ところが蓄積されてしまうため、それを初期化するのが fflushです。なんにしてもgetsはなんでもかんでも 上書きしやがる凶悪な奴なの私は嫌いです。。

noname#3495
noname#3495
回答No.3

scanfでfilenameを読み込ませる前に 別のscanfで何か読み込ませていませんか? scanfは[Enter]のキーコードが次のscanfに持ち越される 性質を持っていますので… 私は一時期↑でドツボにはまっていた事がありまして… もし、はずしていたらすいません。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

どんなファイル名を入力した、とか、どういうふうに駄目だった、とかが書かれて いないので、回答も占いのよう(当たるも八卦…)なものしかできません。 ありそうなところとして、空白を含むファイル名を入力した、というのが思いつきます。 scanf() は、空白やタブで項目を区切ってしまうから、期待通りの文字列が filename に 入っていなかった、というところでしょうか。

関連するQ&A