c - 接受字段中的有效输入

标签 c validation

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

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

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

最佳答案

验证输入(尤其是来自 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 );
   }

关于c - 接受字段中的有效输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14222109/

相关文章:

c++ - 将内存分配给 void* 时的 gcc calloc 行为

c堆内存布局

c - 特定地址处的动态结构数组

css - flex 和 flex-flow 未验证

ruby-on-rails - 如何设置 Rails 验证列 hstore 键的唯一性?

validation - 在ASP.NET MVC 3中,AllowEmptyString = true的RequiredAttribute

c - 文件数据到C中的链表

c - 确定进程的状态

jquery - Chrome 不接受使用 jQuery 验证的特定日期格式

php - 在 CodeIgniter 中提交后显示表单成功