ここから質問投稿すると、最大4000ポイント当たる!!!! >>

初歩すぎる質問でもうしわけありませんが、

str[100]という配列を用意して

無限ループ内に
while(1){
printf("入力してください>>>");
scanf("%10s",str);
}
などとして、実行して
10文字以上入力すると、
「入力してください>>>」が一回ではなく
「入力してください>>>入力してください>>>」
のように複数でるのですが、なぜでしょうか??

なにがおきているのでしょうか??

A 回答 (1件)

10文字より多く(以上ではありませんね)入力した場合、初回のscanfではすべての文字を消化し切れません。


ですから、

printf("入力してください>>>");
scanf("%10s",str); /* ← ここで、0123456789abcd と入力 */
/* この時点で、str には 0123456789 が格納され、入力ストリームには abcd が残る */

printf("入力してください>>>"); /* (1) */
scanf("%10s",str);
/* 先ほどの食べ残しである abcd が str に格納される */

printf("入力してください>>>"); /* (2) */
scanf("%10s",str); /* ← 入力ストリームが空になっているので、入力待ちに入る */

という訳で、上記の(1)および(2)の「入力してください>>>」が連続して出力されるのでしょう。
ただし、標準出力のバッファリングの仕様しだいでは、必ずしもこの動作になりませんのでご注意ください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「memcpy」と「strcpy」について

C言語の初心者です。
先日、課題として以下のようなことを言われました。

「memcpyとstrcpyについて、メモリ破壊が起こるとしたら
どんな場合が考えられるか、簡単にまとめて報告してみて下さい。」
と言われました。

私にはメモリ破壊というニュアンスが分からないのですが、
どちらの関数も必要以上にコピーを行ったときに
起こるメモリ破壊ということなのでしょうか?
それとも、何か特別な意味があるのでしょうか?

C言語に詳しい方がいましたら、是非、教えて下さい。
宜しくお願いします。

Aベストアンサー

 メモリ破壊とは、「当然そこに入っているべき値」を、不用意に上書きしてしまうことです。

 たとえば、char a[100]; という宣言をしたとします。

 memcpy( a, 0, 200 );

 すると、このような実行を行った場合、変数 a の後ろにどんなメモリが存在しているのかプログラマは知ることができないのに、変数 a の後ろの未定メモリ100バイトを上書きしてしまいます。

 この未定メモリには、もしかしたら別の変数があるかもしれませんし、プログラムの一部があるかもしれません。あるいはOSのシステム領域かもしれません。
 どのみちプログラムは正常に動かなくなります。
 通常はメモリエラーが出て停止しますが、最悪の場合、メモリ上のOSを破壊してリセットするしかなくなったりもします。

 これがメモリ破壊です。


人気Q&Aランキング