我正在编写提示用户输入数字的代码。如果输入是非数字的,它会循环回到提示。我在尝试验证输入是否仅包含数字字符时遇到了困难。到目前为止,我的代码似乎只检查输入的第一个字符。例如:
545454 从循环中断。 54545j 从循环中断。 asdfgh 循环回到提示符。 a54545 循环回到提示符。
任何包含字符的输入都应返回到提示。
这是我指的循环:
int a;
int b;
char buffer[100];
long long ccnum;
do
{
printf("Please input the credit card number: ");
fgets( buffer, sizeof(buffer), stdin );
}
while ( sscanf( buffer, "%lld", &ccnum) != 1 );
我只是想了解为什么无论输入中非数字字符的位置如何,它都不会循环回提示。我是否至少在正确的轨道上获得了我正在寻找的验证?
任何帮助表示赞赏。
你的测试只检查输入是否以数字开头,它会接受初始空格和一个可选的符号,这也应该是无效的。
您可以为此使用
sscanf()
,但格式不同:
%*[0-9]
读取并丢弃所有数字(至少一个),然后%n
将找到的位数设置为 int
变量和%1[\n]
正好读取一个换行符。如果
sscanf()
返回1
,则换行符已经找到,len
包含找到的位数。如果返回值不是1
,则输入不完全由数字组成或为空行。
测试
fgets()
失败也需要检测和报告文件结束。
这里是修改版:
char buffer[100];
char eol[2];
int len;
for (;;) {
printf("Please input the credit card number: ");
if (!fgets(buffer, sizeof(buffer), stdin)) {
printf("unexpected end of file\n");
exit(1);
}
if (sscanf(buffer, "%*[0-9]%n%1[\n]", &len, eol) != 1) {
printf("invalid input: must only contain digits\n");
continue;
}
if (len != 13 && len != 16) {
printf("credit card number must have 13 or 16 digits\n");
continue;
}
break;
}
如 @Fe2O3 所建议,您可以使用
sscanf()
中的 strspn()
代替 <string.h>
来实施相同的测试:
// counts the number of digits at the beginning of buffer
len = strspn(buffer, "0123456789");
if (buffer[len] != '\n') {
printf("invalid input: must only contain digits\n");
continue;
}