0

オプションのリストがユーザーに表示され、整数を入力して選択するオプションを指定するプログラムに取り組んでいます。有効なもの。しかし、文字や文字列などの他の値を入力すると、プログラムは無限ループに入り、オプションのリストが無限に出力されます。どうすればこれを修正できますか? つまり、定義済みの整数変数に整数ではない値を入力したときに、ユーザーにエラーを与えることができるはずです。

どんな助けでも感謝します。これがサンプルコードです。

do{
    printf("Select appropriate option.\n");
    printf("Press 1 to do this");
    printf("Press 2 to do that.\n");
    printf("Press 3 to exit the program.\n");
    scanf("%d",&choice);
    if(choice!=1 && choice!=2 && choice!=3)
        printf("You entered an invalid choice. Please enter again.\n");
    switch(choice){
        case 1:
            //do this
             break
        case 2:
            //do that
            break;
        case 3:
            exit(1);
           }}


while(choice!=3);

基本的に、ユーザーが整数以外の値をchoice入力すると、プログラムにユーザーに通知して別の入力を求めるようにします。

4

4 に答える 4

1

scanf整数変数への直接では実行できません。そのようなものscanfは を受け入れるだけでなく、やその他の入力1.23も受け入れます。(およびその他の変換関数) は、要求された形式に従って可能な限り読み取ります。フォーマット要件を満たさないものを見つけたときに停止し、単にそのままにしておきます。1abcdescanf

この種の分析を実行する場合は、入力を文字列として読み取り、その文字列を手動で解析および分析する必要があります。

C スタイルのコード スケッチ ([C++] とタグ付けされているにもかかわらず、C スタイルのコードを主張しているため) 次のようになります。

char buffer[100]; /* 100 should be enough for everyone :) */
int n = scanf("%s", buffer);
if (n < 1)
  /* ERROR, can't read */;

char *end;
long choice = strtol(buffer, &end, 10); 
if (end == buffer || *end != '\0' || errno == ERANGE)
  /* ERROR, bad format */;

/* ... */
于 2013-09-22T05:30:27.423 に答える
0
  1. iostream を使用します - http://www.cplusplus.com/reference/iostream/を参照してください
  2. そうは言っても、使用を主張する場合scanfは、戻り値を確認してください-つまり、http://linux.die.net/man/3/scanfを読んでください
于 2013-09-22T05:35:47.143 に答える
0

scanfは、変換時に数字以外を消費しません%d0何も変換しなかったので戻りますが、「不正な入力」はまだ消費されるのを待っています。有効な入力の準備ができるようにするには、何らかの方法でそれを消費する必要があります。

if(また、でテストする前に、 で 3 を除外していることにも注意してくださいswitch

于 2013-09-22T05:25:52.133 に答える