我正在尝试使用 sscanf() 来验证命令行输入
我只希望像 1、0.1、0.111 这样的东西通过,不是 A12 12A 或 1.2A
我试过了
if (sscanf(input, "%f", &val) != 1) { // to check for 1 successful conversion
printf("invalid input");
}
但似乎我也让无效的输入通过。
有什么建议吗?
当sscanf(input, "%f", &var)
遇到输入12a
或1.2a
时,它会在无效的输入部分停止,剩余的字符可供后续格式代码读取。
请考虑以下字符串对于有效数字后面的浮点数具有无效字符:
-
1.0 2.0
(一个空格) -
1.0, 2.0
(逗号) -
1.0a 2.0
(一封信)
和逗号对于我们的人工解析引擎来说看起来没问题;当发现无效字符时,机器浮点解析就会停止,无论是人类可接受的空格或逗号,还是丑陋的字母。
如果要确保浮点数后面不会紧跟垃圾,则可以使用类似以下内容:
n = sscanf(input, "%f%c", &var, &ch);
if (n == 1 ||
(n == 2 && (ch == ' ' || ch == ',' || ...))) {
// ...
}
sscanf
不是你的朋友,在这里。 即使您检查结果确保你成功地阅读了一个完整的论点,这不会真正保证输入在有意义的意义上是有效的。
给定输入如下:
1!!!1!oneone!
%f
解析将在读取第一个1
后停止(但成功),并将读取指针保留在以下!
。 这可能不是您考虑"有效输入"。
如果同一行上的任何东西都被视为垃圾,那么它会得到困难,因为scanf
不区分空格和换行符。 也许尝试这样的事情:
int main(int argc, char *argv[])
{
float val;
char c;
if (sscanf(argv[1],"%f%c",&val,&c)!=1)
{
printf("invalid input");
}
return 0;
}
现在它将验证所有命令行输入是否为浮点数输入。