我正在尝试创建一些只接受有效的代码作为用户输入的代码,比如在询问名称等时没有整数... 到目前为止我已经尝试过了,
if(!gets(newCust.name))
{
printf("invalid data\n");
menu();
}
但是,由于name是string类型,当用户输入整数时,它似乎是有效的。我还可以使用其他简单的选项吗?
答案 0 :(得分: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 );
}
答案 1 :(得分:0)
我建议您不要排除无限的无效选项,而是定义有效值应该是什么,然后检查它。通常的方法是使用regular expression。可能对于一个名称,您需要检查类似于\w[\w\s]*
的正则表达式,这意味着“至少有一个单词字符,后跟任意数量的单词字符和空格”。