名前などを尋ねるときに整数がないなど、有効なもののみをユーザー入力として受け入れるコードを作成しようとしています...これまでに試しましたが、
if(!gets(newCust.name))
{
printf("invalid data\n");
menu();
}
ただし、名前は文字列型なので、ユーザーが整数を入力すると有効に見えます。他に使用できる簡単なオプションはありますか?
名前などを尋ねるときに整数がないなど、有効なもののみをユーザー入力として受け入れるコードを作成しようとしています...これまでに試しましたが、
if(!gets(newCust.name))
{
printf("invalid data\n");
menu();
}
ただし、名前は文字列型なので、ユーザーが整数を入力すると有効に見えます。他に使用できる簡単なオプションはありますか?
入力 (特に 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 );
}
無限の無効なオプションを除外する代わりに、有効な値を定義してから、それを確認することをお勧めします。これを行う通常の方法は、正規表現を使用することです。名前については、\w[\w\s]*
「少なくとも 1 つの単語文字の後に、任意の数の単語文字とスペースが続く」という意味の正規表現をチェックする必要があります。
関連項目: C の正規表現: 例?