1

我正在尝试创建一些只接受有效的代码作为用户输入,比如在询问姓名等时没有整数......到目前为止我已经尝试过了,

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

但是,由于 name 是字符串类型,因此当用户输入整数时,它似乎是有效的。我可以使用其他任何简单的选项吗?

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]*“至少一个单词字符,后跟任意数量的单词字符和空格”的正则表达式。

另请参阅:C 中的正则表达式:示例?

于 2013-01-08T21:17:54.960 回答