1

名前などを尋ねるときに整数がないなど、有効なもののみをユーザー入力として受け入れるコードを作成しようとしています...これまでに試しましたが、

    if(!gets(newCust.name))
    {
        printf("invalid data\n");
        menu();
    }

ただし、名前は文字列型なので、ユーザーが整数を入力すると有効に見えます。他に使用できる簡単なオプションはありますか?

4

2 に答える 2

3

入力 (特に C からの) の検証は、かなりの作業になる可能性があります。一般に、私が行う方法は、バッファを読み取ることです(バッファ オーバーフローを回避する代わりに、fgets( ..., stdin)を使用する必要があります)。getsバッファーを読み取った後 (入力が何であれ)、バッファー内のデータを検証するコードを記述します。

たとえば、strtolを使用して、バッファーから整数値を読み取ることができます。これにより、バッファーに整数 (および整数のみ) があるかどうかを判断できます。

一般的な考え方は次のとおりです。

char buf[1024];
int val;
char *endptr;

printf( "Enter something..." );
if ( fgets( buf, sizeof buf, stdin )) {
   val = strtol( buf, &endptr, 10 );

   // check for some of the possible errors
   if ( val == LONG_MIN )
      printf( "Underflow error (%d)\n", errno );
   else if ( val == LONG_MAX )
      printf( "Overflow error (%d)\n", errno );
   else if ( endptr == buf )
      printf( "No digits provided\n" );
   else if ( *endptr != '\0' && *endptr != '\n' )
      printf( "Something besides an integer was given (%u)\n", *endptr );
   else
      printf( "The value is apparently valid\n" );
   printf( "val = %d\n", val );
   }
于 2013-01-08T19:08:06.753 に答える
0

無限の無効なオプションを除外する代わりに、有効な値を定義してから、それを確認することをお勧めします。これを行う通常の方法は、正規表現を使用することです。名前については、\w[\w\s]*「少なくとも 1 つの単語文字の後に、任意の数の単語文字とスペースが続く」という意味の正規表現をチェックする必要があります。

関連項目: C の正規表現: 例?

于 2013-01-08T21:17:54.960 に答える