掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29171

scanf関数について
投稿者---kuro(2006/12/06 15:56:05)


下のソースだと %d を使用しているので 数字以外を入力すると壊れますよね。
%d を使用したままで 数字以外を入力しても壊れない(数字以外でもループする)ようにするにはどうしたらいいのでしょう?


#include<stdio.h>


int main( void )
{
    int sample = -1;


    while( sample < 0 ){
        printf( "サンプル:" );
        scanf( "%d", &sample );
    }
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:scanf関数について 29172 keichan 2006/12/06 16:17:16
<子記事> Re:scanf関数について 29180 kuro(投稿者とは別) 2006/12/07 02:42:05


No.29172

Re:scanf関数について
投稿者---keichan(2006/12/06 16:17:16)


ずばりの回答が載っています。
http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-4


この投稿にコメントする

削除パスワード

No.29173

Re:scanf関数について
投稿者---kuro(2006/12/06 17:00:58)


>ずばりの回答が載っています。
ありがとうございました。
解決することが出来ました。 atoi は思いつきませんでした^^


この投稿にコメントする

削除パスワード

No.29176

Re:scanf関数について
投稿者---yoh2(2006/12/06 21:22:11)


>解決することが出来ました。 atoi は思いつきませんでした^^

atoi()は、引数の文字列に非数字列が指定されたときの結果が不定ですので、
非数字列への対応のために%dから切り替えるのでしたら、atoi()ではなく
strtol()を利用するのがよいと思います。
ちなみに、strtol()ではなくstrtoul()にすると、負の数も気にせずに済みます。


上記内容とは関係ありませんが、オマケとしてscanf()のみ使う、%dを使用したままという
条件を満たしてみたサンプルを載せてみます。
はっきり言ってオススメできませんが。
    int sample;

    for(;;){
        printf("サンプル:");

        /* 空白、改行読み飛ばしのために、%dの前に空白を置いておく */
        switch(scanf(" %d", &sample)){
        case 1: /* 数値読み込み成功 */
            if(sample >= 0){
                goto loop_end;
            }
            break;

        case EOF: /* エラーまたは入力が打ち切られた */
            /* エラー処理を書くべし */
            break;

        default: /* 非数字列が入力された。case 0:でも同様 */
            scanf("%*[^-+0-9\n]"); /* 符号と0..9、改行以外を読み飛ばし */
            break;
        }
    }
loop_end:



この投稿にコメントする

削除パスワード

No.29180

Re:scanf関数について
投稿者---kuro(投稿者とは別)(2006/12/07 02:42:05)


う〜ん 同じ名前の人が出てきたけど、まぁいいか
↓のように、数字以外を入力すると改行が残る仕様らしいので、fflush(stdin);でバッファを空にしてあげると再度入力できますよ。

#include<stdio.h>


int main( void )
{
    int sample = -1;


    while( sample < 0 ){
        printf( "サンプル:" );
        fflush(stdin);
        scanf( "%d", &sample );
    }
}



この投稿にコメントする

削除パスワード

No.29181

Re:scanf関数について
投稿者---nop(2006/12/07 08:50:50)


> fflush(stdin);

入力ストリームに対するfflush()は未定義動作です。


この投稿にコメントする

削除パスワード

No.29202

Re:scanf関数について
投稿者---omega(2006/12/09 22:47:01)


fflush→rewind


この投稿にコメントする

削除パスワード

No.29203

Re:scanf関数について
投稿者---YuO(2006/12/09 23:53:54)


長年の疑問なので……。

>fflush→rewind

標準入力をrewindしたらなぜ解決できるのでしょうか。
規格書を捜したのですが,rewindしたら解決できるという根拠を見つけることは出来ませんでした。

特定の環境における実装でどうこういう話には興味がないので,標準の範囲内で説明をお願いします。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧