0

私はこのコードを持つプログラムを持っています:

#include<stdio.h>
main(){
  int input;
  char g;

  do{
    printf("Choose a numeric value");
    printf(">");
    scanf("\n%c",&input);
    g=input-'0';
   }while((g>=-16 && g<=-1)||(g>=10 && g<=42)||(g>=43 && g<=79));

}

基本的にASCII操作を使用して、プログラムが数値のみを受け入れるようにします。「0」にはデフォルトで値48が与えられます... ASCII値-48は、上記の数値の範囲を示します(whileステートメント内)

とにかく、ユーザーが数字とアルファベットを入力するときはいつでも:

abr39293afakvmienb23

プログラムは:a、b、r ..を無視しますが、最初の入力として「3」を取ります。abとrの場合、doループの下のコードが繰り返されます。したがって、上記の例では、次のようになります。

Choose a numeric value
>Choose a numeric value>
Choose a numeric value
>3

これを止める方法はありますか?\ n%cを使用して文字をスキャンし、空白を考慮してみましたが、うまくいきませんでした:(

助けてください

どうもありがとうございます !

4

5 に答える 5

1

あなたの質問から私が理解しているのは、ユーザーが入力abr3すると、得られる出力は次のようになるということです。

数値を
選択する数値を選択する>数値を
選択する
3

今、あなたはこれらの「過剰」が現れるものをしませんChoose a numeric value。ユーザーがabr3を入力した場合は、そこから3を取得して終了します。このようなもの。

$数値を選択>abr3
$

scanf()これを行うには、ステートメントのフォーマット指定子を変更する必要があります。プログラムを試してみてください

input = 0 ;
scanf( "%[0-9]" , &input );

中括弧内のすべてのコンテンツ、つまり0〜9を受け入れるようにscanfに指示します。この範囲外の他の文字は無視されます。ユーザーが入力した場合abr3、aは範囲内にないため、入力はゼロのままになります。また、Choose a numeric valuea、b、rは表示されません。

ユーザー入力が0〜9の範囲の数値である場合、それは受け入れられ、入力に入れられます。

input==0のチェックを追加する必要があります。

それが役に立てば幸い。

于 2010-05-09T05:28:44.837 に答える
0

問題がscanf空白を無視することである場合は、のgetchar代わりに試してくださいscanf

于 2010-05-09T03:08:23.550 に答える
0

/ループのprintf("Choose a numeric value"); 外側(直前)に移動してみませんか?ループの内側にある場合は、ループのすべてのレッグで実行され、外側にある場合は、ループの前に1回だけ実行されます。dowhile

于 2010-05-09T03:14:21.747 に答える
0

以下の例を使用してみてください。メモリを解放することを忘れないでください。

#include <stdio.h>

int main()
{
  int size = 100;
  char *line;
  int number;

  while (1) {
    puts("Enter number");
    line = (char *) malloc((sizeof(char) * size) + 1);
    getline(&line, &size, stdin);

    if (sscanf(line, "%d", &number) != 1) {
      puts ("\nInvalid input");
    } else {
      break;
    }
  }

  printf ("\nInput number\n%d\n", number);

  return 0;
}
于 2010-05-09T03:53:34.750 に答える
0

プログラムは印刷Choose a numeric value>してから、入力行を待ちます。次に、入力に沿ってスキャンしChoose a numerical value>、数字または制御文字に到達するまで印刷可能な各文字を印刷してから停止します。数字または制御文字がない場合は、別の行を繰り返し読み取ります。

それがプログラムに実行させたいことではない場合は、それを変更する必要がありますが、本当の助けを得るチャンスを得るには、プログラムに実行させたいことを言う必要があります。プロンプト文字列から、数字を読みたいように見えますが、入力が数字でない場合はどうしますか?1桁だけですか、それとも複数桁ですか?番号の後にゴミが続く場合はどうでしょうか。必要に応じて、fgetsを使用して行を読み取り、それを解析する方が理にかなっている場合があります(sscanfまたはatoiのいずれかを使用)。これにより、不正な入力に関する適切なエラーメッセージをより簡単に表示できるようになります。scanfの使用は、一般に、インタラクティブな入力よりも、マシンで書き込まれたデータの読み取りに適しています。

于 2010-05-09T03:54:55.263 に答える