【发布时间】:2018-02-21 17:09:09
【问题描述】:
在一个 C++ 项目中,我看到了这个:
#include <cstdlib>
#include <cstdio>
static int isNegative(float arg)
{
char p[20]; // Assume 20 is enough
sprintf(p, "%f", arg);
return p[0] == '-';
}
int main()
{
printf("%d\n", isNegative(-1));
}
我听说sprintf() 可能有问题,因为它可能会导致写入p 时负号消失。真的吗?或者这种方法是防弹的(但非常糟糕的做法)?
PS:忽略-0 的小写。关注sprintf()。我知道存在更好的解决方案,但我只是对这个感到好奇。也欢迎来自 C 的人提供帮助。
【问题讨论】:
-
“或者那个方法是防弹的” 不,不是(还是昨天的样子)。
-
std::signbit "此函数检测零、无穷大和 NaN 的符号位。与 std::copysign 一起,std::signbit 是仅有的两种检查符号的可移植方法之一一个 NaN。”
-
我有一种似曾相识的奇怪感觉
-
这是一个测试来显示审稿人是否在关注吗?
-
char p[2]; snprintf(p, sizeof p, "%f", arg); return p[0] == '-';足以处理缓冲区大小问题。
标签: c++ c function floating-point printf