1

scanfを介して1つのプログラムでフィルタリングされた入力を取得しました。数字と大きな文字+スペースだけを読みたい。

最近、私はそのようなことをしようとしていましたが、無限ループに陥り、まだ最初の入力しか出力していませんでした。についてfgets()は知っていますが、これが機能したことは知っています。問題がどこにあるのかわかりません。これは単純化された状況です。私に何が起きたのか?

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

int main()
{
  char str[21];

  do
  {
    scanf("%20[0-9A-Z ]", str);
    printf("%s\n", str);
  } while(strcmp("END", str) != 0);

  return 0;
}

編集:私は言及するのを忘れていました、入力は有効です、入力のために:「HELLO」プログラムは立ち往生しています...そしてscanf最初の入力に対してのみ1を返し、他の人は0を返します。そして私も試しfflush(stdin)ました、読んだ後...

4

2 に答える 2

2

数字scanf、大文字 (ラテン アルファベット)、およびスペースのみを受け入れます。

scanf("%20[0-9A-Z ]", str);

そのため、他の何かを入力すると、 へのscanf入力の割り当てに失敗しstr、問題のある入力が入力バッファに残ります。スキャンが成功したかどうかを確認し、失敗した場合は入力バッファーをクリアする必要があります。

また、特に改行は有効な入力トークンに含まれないため、改行のない入力ストリームではなくキーボードなどから入力が行われる場合は、とにかく次の改行まで入力バッファーをクリアする必要があります。

int c;
do
{
  scanf("%20[0-9A-Z ]", str);
  printf("%s\n", str);
  while((c = getchar()) != '\n' && c != EOF); // clear input buffer
} while(c != EOF && strcmp("END", str) != 0);
于 2012-10-15T19:02:24.543 に答える
0

入力に少し依存しますが、scanfが機能したことを確認できます。一致した式の数が返されるため、この場合は1になります。0の場合、入力と一致しないため、現在の場所に固定される可能性があります。

于 2012-10-15T19:01:01.940 に答える