我发现这很奇怪。
虽然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;
}
答案 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
被识别为转换目的的有效字符。在这种情况下,它会导致输入字符串的解析停止,只有字符被解析,直到该点被转换(对于包含a
和f
的字符串也是如此。)
也许您应该查看库实现的文档,并找出strtod
能够针对您的特定情况解析的格式。
答案 2 :(得分:1)
使用D而不是E是Fortran标记double
数据(而不是float
)的方法。您可能正在使用标准库,将其作为扩展名接受。
答案 3 :(得分:0)
哪个平台和编译器?在Linux和Mac OS X中,我得到了这个结果:
::: [1.000000] [10.000000] [1.000000] [1.000000]
表示只有e
有效。请注意,您没有检查错误......