C 有没有办法使用atof并确定更改的值是实际的0还是有错误的值?
为了创建一个简单的向量计算器,我试图找到一种使用atof()的方法,但我唯一的问题是输入向量的元素。使用atof,因为如果字符未转换,则返回值为0。在传递给atof之前,是否需要检查用户从fgets输入到字符数组中的值是否为0 以下是我到目前为止检查字符的代码:C 有没有办法使用atof并确定更改的值是实际的0还是有错误的值?,c,C,为了创建一个简单的向量计算器,我试图找到一种使用atof()的方法,但我唯一的问题是输入向量的元素。使用atof,因为如果字符未转换,则返回值为0。在传递给atof之前,是否需要检查用户从fgets输入到字符数组中的值是否为0 以下是我到目前为止检查字符的代码: do { printf("%s", promptMessage); fgets(size, 256, stdin); /*if(size == 0) { myInput = atof(si
do
{
printf("%s", promptMessage);
fgets(size, 256, stdin);
/*if(size == 0)
{
myInput = atof(size);
sucessful = true;
}*/
if(atof(size) != 0)
{
myInput = atof(size);
sucessful = true;
}
else
{
printf("Please enter a correct number: ");
}
}while(!sucessful);
对不起,如果我说的不太有意义,但我想问的是,在将字符数组中的值发送到atof之前,我是否可以检查它是否为0,或者进行某种检查,以便为向量元素的条目实际设置0值?不要使用
atof()
:atof()
没有有用的错误指示。请改用strod()。通常最简单的解决方案很难找到:
if ( memcmp(buffer,"0.0\n",4) == 0 )
{
// zero - can call atof
}
else
{
// whatever
}
当然,您可能要求以这种方式表示零,而不是使用任何其他模式。毕竟理智的人写0.0而不是-0.000等等;-)为什么这个标记为C++?你确定这是C++吗?如果是,那么为什么要使用
printf
、fgets
和atof
?检查字符串中的字符,看看它们是否只包含数字,最多包含一个句点。为什么不直接使用scanf
?标准没有定义0.0以外的任何错误报告(这也是一个有效值)。但是,如果你使用MSVCRT而不关心可移植性,那你就很幸运了——它会将errno设置为EINVAL。老实说,我不确定我们是否可以使用strtod(),但是可以用sscanf()实现这一点吗?strtod()
是一个比atof()
更低级别的函数,因为atof()
只调用strtod()
(好吧,至少它可以)。是的,你也可以使用sscanf()
:如果(sscanf(“%lf”)和&value)==1
,如果value
是double
类型,或者如果value
是float
类型,我想(我对代码< >代码>函数的格式说明符也不确定;我对C++ iNoSoFipe有更多的了解。SsAcf值帮助了很多!我想看看是否……==0但它不起作用,但现在一切似乎都很好!非常感谢。sscanf
的一个问题是,如果输入字符串在语法上是一个数字,但超出了目标类型的范围,则它有未定义的行为。strtod
是避免该问题的唯一方法(除非您自己从头开始实现)@ dieMeple UHL:C和C++都不需要IEEE 754。C标准中的措辞是:“如果这个对象没有合适的类型,或者如果转换结果不能在对象中表示,则行为是未定义的”;我认为IEEE无穷大必然避免像“代码> sSCANF之类的东西损坏未定义的行为。“1.0E9999”、“%lf”、&x)
。