未检测到错误放置的小数。其他输入错误会导致计数不正确 (!= 3(。 以下是简化的示例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
```
int main()
{
char in[32];
int count;
float a, b, c; /* sides of triangle */
printf("Enter the sides of triangle as numbers with included decimal pointn");
fgets(in, 31, stdin);
count = sscanf(in, "%f %f %f", &a, &b, &c);
printf("count = %dn", count);
printf("you entered %f %f %fn", a, b, c);
return(0);
}
如果用户输入三个用空格分隔的数字,则它工作正常;如果输入了数字以外的内容,则计数是错误的。但是,如果其中两个数字用小数点分隔,例如"2.3.4.6 5.0",则计数是正确的,但最后两个浮点数不正确,即 0.4 和 0.6。
sscanf
将从输入中读取,直到其模式不再匹配,并且如果无法恢复。它只会停止。
在这种情况下,当你在2.3.4.6 5.0
上做%f %f %f
时,真正发生的事情是这样的——
- 遇到
2.3
- 有效,存储到a
- 遇到
.4
- 有效,存储到b
- 遇到
.6
- 有效,存储到c
这就是sscanf
停止的时候,因为所有格式说明符都已提取。
现在,使用格式字符串很难清理用户输入,但在您的特定情况下 - 这是可能的,尽管很黑客。
您应该使用的格式说明符是 -%f%*[. ]%f%*[. ]%f
那么它有什么作用呢?
%f
-> 读取有效的浮点数%*[. ]
-> 读取任意数量的- 小数点或空格 - 并丢弃它
我想你可以看到我要去哪里,这就是sscanf
的样子——
count = sscanf(in, "%f%*[. ]%f%*[. ]%f", &a, &b, &c);
现在,输入输入!
2 3 1
你得到
2.000000 3.000000 1.000000
等等,这并不能证明什么,怎么样——
2.3.4.6 5.0
你得到
2.300000 4.600000 5.000000
呵呵,现在我们要去某个地方
我肯定玩得很开心,喂这个——
256.1450 31.5.6.4
你得到,
256.144989 31.500000 6.400000
(不用担心四舍五入,这就是浮点数在内存中的存储方式(
还没做完,这个怎么样——
256.1450 31.5.6
这甚至看起来都不像有效的浮动,那是日期吗?
256.144989 31.500000 6.000000
不,你仍然可以从那个那里得到漂浮物。
只是为了让你知道,是的,当然你可以在技术上用sscanf
做一大堆黑客模式匹配,但这真的不是很实用。我希望这确实回答了您的问题,但是,如果您不能信任用户输入,请考虑遍历字符串。
除非,你想使用黑客的东西。