- ベストアンサー
C言語のプログラムでisdigit関数の使い方を理解したい
- C言語のプログラムでisdigit関数を使用し、時給の入力を制限する方法について質問があります。
- isdigit関数は、数字を渡せば0以外の数を返し、数字以外を渡せば0を返します。
- プログラムを実行すると、数字以外の入力をした場合でも永遠に入力待ち状態になってしまいます。制限を加える方法について教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>・数字一文字打てばまた入力待ちになる 既に回答されているように「数値」として処理される為、「数字」ではないのでisdigit()が偽を返します。 ので、ループ抜けられません。 >・数字以外を一文字打てば永遠にprintf関数とscanf関数が実行される 数字ではなかったので、scanf()が数値に変換不可能でエラーを返します。 その際、標準入力には「数字以外」が残ったままになります。 で、paymentの値は変わらないのでisdigit()が偽を返しループ継続します。 ループでもう一度scanf()がコールされたので標準入力のバッファの先頭にある文字を読み込んで数値変換を試みようとします。 が、やはり数字ではないのでそのままバッファに残してエラーを返却します。 paymentの値は変わらないのでisdigit()が偽を返しループ継続します。 ループでもう一度scanf()がコールされたので標準入力のバッファの先頭にある文字を読み込んで数値変換を試みようとします。 が、やはり数字ではないのでそのままバッファに残してエラーを返却します。 paymentの値は変わらないのでisdigit()が偽を返しループ継続します。 ループでもう一度scanf()がコールされたので標準入力のバッファの先頭にある文字を読み込んで数値変換を試みようとします。 が、やはり数字ではないのでそのままバッファに残してエラーを返却します。 paymentの値は変わらないのでisdigit()が偽を返しループ継続します。 ループでもう一度scanf()がコールされたので標準入力のバッファの先頭にある文字を読み込んで数値変換を試みようとします。 が、やはり数字ではないのでそのままバッファに残してエラーを返却します。 paymentの値は変わらないのでisdigit()が偽を返しループ継続します。 ループでもう一度scanf()がコールされたので標準入力のバッファの先頭にある文字を読み込んで数値変換を試みようとします。 が、やはり数字ではないのでそのままバッファに残してエラーを返却します。 paymentの値は変わらないのでisdigit()が偽を返しループ継続します。 ループでもう一度scanf()がコールされたので標準入力のバッファの先頭にある文字を読み込んで数値変換を試みようとします。 が、やはり数字ではないのでそのままバッファに残してエラーを返却します。 paymentの値は変わらないのでisdigit()が偽を返しループ継続します。 ループでもう一度scanf()がコールされたので標準入力のバッファの先頭にある文字を読み込んで数値変換を試みようとします。 が、やはり数字ではないのでそのままバッファに残してエラーを返却します。 : paymentの値は変わらないのでisdigit()が偽を返しループ継続します。 ループでもう一度scanf()がコールされたので標準入力のバッファの先頭にある文字を読み込んで数値変換を試みようとします。 が、やはり数字ではないのでそのままバッファに残してエラーを返却します。 Ctrl+Cなどで停止させるまで、愚直に繰り返します。 こういう場合、"%d"でうけるのではなく、"%s"で文字列として受け取って、その後で変換可能か処理する。 というのが一般的でしょう。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
(2) はとりあえず条件をはっきりさせるところからスタートだね. 例えば ・「20x」という入力に対してどうする? ・「20 x」という入力に対してはどうする? ・「-3.6」は? とか, 悩みだすと難しい.
- Wr5
- ベストアンサー率53% (2173/4061)
>実際には、一文字の制限なく、数字以外の何かを入力したら、再び入力待ちになるプログラムを作りたいのですが、これはどうしたらいいのでしょうか。 こっち回答していませんでしたな。 まぁ、やることは同じなんですが。 char Input[20]; int i, loopend; do { printf("時給:"); scanf("%s", Input); loopend = 1; for(i = 0;Input[i] != '\0';i++) { if(isdigit(Input[i]) == 0) loopend = 0; } } while(loopend == 0); みたいな。 # scanf()がエラーになっていないかの確認をした方がよかったり、バッファオーバーランしないように対策が必要だったり…と他にもありますけどね。
- wormhole
- ベストアンサー率28% (1626/5665)
>scanf("%d",&payment); この場合、paymentには文字ではなく数値が入ってます。 "%d"の意味とscanfの戻り値について調べ直しましょう。 例えば標準入力から 9 を入力した場合、 payment = 9; をしたのと同じです。 isdigit()などで検査できるのは文字ですので payment = '9'; の状態でないと検査できません。