175 :
デフォルトの名無しさん:
#include <stdio.h>
void main(){
char s[100],m[100];
scanf("%s",s);
gets(m);
printf("%s\n%s\n",s);
}
でgetsが飛ばされて実行される理由は何ですか?
176 :
デフォルトの名無しさん:01/12/15 05:39
あ、最後の間違い
printf("%s\n%s\n",s,m);
です
>>175 入力バッファに'\n'が残っていてgets()はそれを取ってきてしまう。
対処法はgets()のまえにffluch(stdin);
これって宿題なのか?
man gets↓
バグ
gets() は絶対に使用してはならない。データを知ることなし に
gets() が何文字読むかを先に知る事はできず、 gets() がバッ
ファの終りを越えて書き込み続けるため、使用は大変危険 で あ
る。この事はコンピュータのセキュリティを破るのに使われてき
た。代わりに fgets() を使うこと。
>>177 折れんとこそれ駄目だったよ(gcc on Linux)?
#include <stdio.h>
int main()
{
char s1[100], s2[100]; /* ←名前が悪いから176みたいなことになる */
scanf("%s\n", s1); /* ←こうすればよい */
fgets(s2, sizeof(s2), stdin); /* ←178参照 */
printf("%s\n", s1);
printf("%s\n", s2);
return 0;
}
>>179 ダメって fflush 使ってもちゃんと動かなかったって話?
ffluch (c じゃないだろ) が無いとかいう話?
fflushってパイプとかの時結構コケルんじゃ無かったかな(うろ覚え)
# と言うかスペル間違えてるよー (^ ^;
$./a.out[RET]
first_str[RET]
firat_str
$
↑聞きやがらねぇ
fgetsを二つ続けて、sscanfや、strtolすれば済む話では?
>>177 読み込み用にオープンされたFILEに対するfflush()の動作は、
未定義じゃなかったか。
たまたまペンディングされたデータを捨てる処理系もあるが。
>>179 glibcにはfpurge()というのがあるが、Linuxではサポートされ
てないと書いてあるな。
185 :
デフォルトの名無しさん:01/12/15 11:35
えふふらっちage
>184
>未定義
あっ、そうだったんすか…
>185
iyan...
187 :
デフォルトの名無しさん:01/12/15 13:22
ここって、宿題に答えてもらえるんではなく、
宿題を出されるスレだたのか!(((( ;゚Д゚)))ガクガクブルブル
ルンゲの子はもうどうでもよくなったのか?
>>187 fflush はバッファの中を消すのでなく (消すのは fpurge)
行使 (変な表現ですが…) するのですね。
しかし、行使するにあたって、出力用バッファは書き出すところが決まっているのに対し、
入力用バッファは書き出す (というか受け取る) ところが決まってないので、
入力用バッファは行使 (fflush を適用) されるべきものではない。
みたいな感じでしょか?
って入力用に関する話でなく fflush の機能にレポートか…
fflush は入出力にあたってバッファリングされているもので
宛先が決まっているもの (つまり出力用ストリーム) を行使する。
fflush に出力用にオープンされたストリーム (FILE*型) を渡すと
そのストリームのバッファを書き出し、
NULL が渡されると、すべての出力用ストリームのバッファを書き出す。
以上、こんなかんじで勘弁して下さい。