宿題みてあげるっ

このエントリーをはてなブックマークに追加
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ってパイプとかの時結構コケルんじゃ無かったかな(うろ覚え)
# と言うかスペル間違えてるよー (^ ^;
182179:01/12/15 09:35
$./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
186177:01/12/15 12:23
>184
>未定義
あっ、そうだったんすか…

>185
iyan...
187デフォルトの名無しさん:01/12/15 13:22
宿題age
>>177
http://www.freebsd.org/cgi/man.cgi?query=fflush&apropos=0&sektion=0&manpath=FreeBSD+4.4-RELEASE&format=html
を見てfflushの機能についてレポート提出の事。
ここって、宿題に答えてもらえるんではなく、
宿題を出されるスレだたのか!(((( ;゚Д゚)))ガクガクブルブル
ルンゲの子はもうどうでもよくなったのか?
190177:01/12/16 02:21
>>187
fflush はバッファの中を消すのでなく (消すのは fpurge)
行使 (変な表現ですが…) するのですね。
しかし、行使するにあたって、出力用バッファは書き出すところが決まっているのに対し、
入力用バッファは書き出す (というか受け取る) ところが決まってないので、
入力用バッファは行使 (fflush を適用) されるべきものではない。

みたいな感じでしょか?
191177:01/12/16 02:36
って入力用に関する話でなく fflush の機能にレポートか…

fflush は入出力にあたってバッファリングされているもので
宛先が決まっているもの (つまり出力用ストリーム) を行使する。

fflush に出力用にオープンされたストリーム (FILE*型) を渡すと
そのストリームのバッファを書き出し、
NULL が渡されると、すべての出力用ストリームのバッファを書き出す。

以上、こんなかんじで勘弁して下さい。