sscan 能否检测小数点是否意外用作浮点数字符串中的分隔符?



未检测到错误放置的小数。其他输入错误会导致计数不正确 (!= 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做一大堆黑客模式匹配,但这真的不是很实用。我希望这确实回答了您的问题,但是,如果您不能信任用户输入,请考虑遍历字符串。

除非,你想使用黑客的东西。

最新更新