strtod接受“e”但也接受“d” - 为什么?

时间:2011-06-02 15:20:44

标签: c strtod

我发现这很奇怪。

虽然strtod接受'e'作为输入字符串中的一个字符(确切地说是一个字符)是有意义的,但我发现它也接受'd'。

有人可以解释一下吗?

#include < stdio.h >
#include < stdlib.h >
int main ()
{
char *s[] = {"1a1", "1e1", "1d1", "1f1"};
char * pEnd;
double d0, d1, d2, d3;
d0 = strtod (s[0],&pEnd);
d1 = strtod (s[1],NULL);
d2 = strtod (s[2],NULL);
d3 = strtod (s[3],NULL);
printf ("::: [%f] [%f] [%f] [%f] \n", d0, d1, d2, d3);
return 0;
}

4 个答案:

答案 0 :(得分:4)

“接受”是什么意思?这是我得到的输出

::: [1.000000] [10.000000] [1.000000] [1.000000]

strtod(与C中的所有其他转换例程一样)解析字符串,直到找到“不属于”的字符。该字符不被视为错误,它只被视为终结符。如果"1d1"仅解析了第一个"1",则解析将停留在'd'。转换结果为1.0(应该如此)。

如果您要求strtod从每次调用中返回“结束指针”,您会看到指针指向其中包含'd'的输入字符串的字符'd'(这同样适用于'a''f'

如果得到的结果不同,则必须是您正在使用的实施的怪癖。

答案 1 :(得分:3)

您使用哪些编译器/库来编译此代码?假设您使用的是Visual Studio,则需要此行为(引用MSDN中的文本):

  

strtod期望nptr指向a   以下形式的字符串:

     

[whitespace] [sign] [digits] [.digits]   [{d | D | e | È} [登录]位数]

您可以找到strtod here

的完整文档

该库的其他实现可能会支持类似的东西。但是,strtod找到here的手册页并未声明d被识别为转换目的的有效字符。在这种情况下,它会导致输入字符串的解析停止,只有字符被解析,直到该点被转换(对于包含af的字符串也是如此。)

也许您应该查看库实现的文档,并找出strtod能够针对您的特定情况解析的格式。

答案 2 :(得分:1)

使用D而不是E是Fortran标记double数据(而不是float)的方法。您可能正在使用标准库,将其作为扩展名接受。

答案 3 :(得分:0)

哪个平台和编译器?在Linux和Mac OS X中,我得到了这个结果:

::: [1.000000] [10.000000] [1.000000] [1.000000]

表示只有e有效。请注意,您没有检查错误......