- ベストアンサー
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) { -------- -------- } 上では実行できましたが、下ではダメでした。 なにか初歩的なミスをしてるようなんですが、わかりません。 教えていただきたいのですが。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#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)
scanfを実行毎にfflush(stdin)を実行することで解決しませんか? yokoyariさんのいわれてるようにscanfでは読みとった部分以外の ところが蓄積されてしまうため、それを初期化するのが fflushです。なんにしてもgetsはなんでもかんでも 上書きしやがる凶悪な奴なの私は嫌いです。。
scanfでfilenameを読み込ませる前に 別のscanfで何か読み込ませていませんか? scanfは[Enter]のキーコードが次のscanfに持ち越される 性質を持っていますので… 私は一時期↑でドツボにはまっていた事がありまして… もし、はずしていたらすいません。
- a-kuma
- ベストアンサー率50% (1122/2211)
どんなファイル名を入力した、とか、どういうふうに駄目だった、とかが書かれて いないので、回答も占いのよう(当たるも八卦…)なものしかできません。 ありそうなところとして、空白を含むファイル名を入力した、というのが思いつきます。 scanf() は、空白やタブで項目を区切ってしまうから、期待通りの文字列が filename に 入っていなかった、というところでしょうか。