2

1以下のプログラムでは、 to の間に数値を入力しようとしていますが、ステートメントの実行中にor ( s or のように)100を入力すると、無限ループが作成されます。だから私はしようとしています....文字列または文字を入力すると、「間違った値が入力されました。もう一度入力してください」のようなメッセージが表示され、もう一度入力されます...ありがとうござい ます。a 'character'"string"sovascanf()

#include<stdio.h>
int main()
{
    int a;
    scanf("%d",&a);
    while(!(a>=1&&a<=100))
    {
        printf("wrong value entered. enter again\n");
        scanf("%d",&a);
    }
    printf("you enter %d. Thanxz",a);
    return 0;
}
4

4 に答える 4

5
  1. の戻り値を確認する必要がありますscanf
  2. ユーザーが整数を入力していない場合は、入力を食べる必要があります。scanf関数は常に整数ではないと言います。もう一度やり直してください。したがって、scanf0 を返す場合は、それに対処する必要があります
于 2013-08-30T05:17:52.187 に答える
4

バッファリングされた入力で作業している scanf を使用する場合、これは、「123」などの値を入力して ENTER を押すと、「123」と終了文字 (ENTER) がすべてバッファに追加されることを意味します。次に、整数を読み取る必要があることを指定しているscanfため、123 を削除しますが、ユーザーが代わりに文字列などの無効なものを入力すると、バッファーは空になりません。%d

キーボードから入力を読み取るより良い方法は、読み取る最大長を指定する fgets() を使用することです。入力を取得したら、sscanf() を使用して数値を取得できます。それまでの ENTER は、入力を刺激しません。

char buffer[128];
fgets( buffer, 128, stdin );
sscanf( buffer, "%d", &a );

また、経験則として、関数からの戻り値を常にチェックして、関数が失敗した場合に適切なアクションを実行できるようにします。

于 2013-08-30T05:22:01.620 に答える
0

これを試して。

#include <stdio.h>
#define FLUSH while (getchar() != '\n')  // macro to eat invalid input

int main (void) {

    int a = 0;
    printf ("Enter an integer: ");
    scanf("%d", &a);

    while (a < 1 || a > 100) {

        FLUSH;
        printf("Invalid input. Please try again: ");
        scanf("%d",&a);
    }

    printf("You entered %d.\nThanks!\n", a);
    return 0;
}

あなたのコードは、変更が必要ないくつかのコーディング習慣を示しています。

  1. (void)のパラメータ リストに含めますmain()
  2. 二項演算子の両側にスペースを残す:while(!(a>=1&&a<=100))不必要に醜く読みにくい.
  3. 論理式を単純化します。(! (a>=1 && a<=100))と同じ意味で(a < 1 || a > 100)、後者の方がはるかに読みやすいのに、なぜ使用 するのですか?
  4. 必要に応じてユーザー入力を求めます。ユーザーに何をすべきかを示すことなく、カーソルを空白行に置いたままにしないでください。
  5. プロンプトでは、適切な文法と大文字を使用してください。プログラミングを怠る理由はありません。
于 2013-08-30T05:40:06.043 に答える
0

scanf からの戻り値が、ユーザーに入力させたい項目の数と等しくない場合は、'\n' が現れるまで、入力バッファーのすべての文字を読み取ります。ただし、ユーザーが何かを入力するコード内の場所にループ全体を何度もコピーする代わりに、次のような関数でループをラップできます。

#include <stdio.h>
#include <stdarg.h>
#include <string.h>

void input(const char *format,...)
{
    va_list ap;
    int r;
    /* number of items [to read] */
    int noi=0;

    for(r=0;r<strlen(format)-1;r++)
    {
        if(format[r]=='%')
        {
            if(format[r+1]!='%')
                noi++;
            else
                r++;
        }
    }

    do
    {
        va_start(ap,format);
        r=vscanf(format,ap);
        va_end(ap);

        if(r!=noi)
        {
            switch(r)
            {
                case EOF:
                case 0:
                    printf("All wrong, try again!\n");
                break;

                default:
                    printf("Unexpected value after item no %d!\n",r);
            }

             while(getc(stdin)!='\n');
        }
        else
            break;

    } while(1);
}

それが役立つことを願って、

1月

于 2013-08-30T06:19:08.833 に答える