2011-06-02 156 views
3

我觉得这很奇怪。strtod接受“e”但也接受“d” - 为什么?

尽管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

这可能有助于:http://stackoverflow.com/questions/2555097/reading-ascii-numbers-using-d-instead-of-e-for-scientific-notation-using-c – cnicutar 2011-06-02 15:29:06

回答

3

你用什么编译器/库来编译这段代码?假设你在Visual Studio中,这是正常现象(从MSDN引用文本):

的strtod预计NPTR指向一个 字符串形式如下:

[空格] [星座] [digits] [.digits] [{d | D | e | Ë} [星座]数字]

你可以找到完整的文档strtodhere

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

也许你应该看看你的库实现的文档,并找出strtod将能够解析您的具体情况的格式。

+0

情况正是如此。我忘了提供编译器信息。 – 2011-06-03 13:53:39

4

你是什么意思的“接受”?这是我收到

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

strtod(如C中其他转换例程)解析字符串直到发现“不属于”字的输出。该字符不被视为错误,只是将其视为终止符。在"1d1"的情况下,只解析第一个"1",解析停止在'd'。转换的结果是1.0(它应该是)。

如果你问strtod返回每一通电话“结束指针”,你会看到指针指向与它'd'输入字符串的字符'd'(同样适用于'a''f'以及)。

如果你得到不同的结果,它肯定是你正在使用的实现的一个怪癖。

+0

当我使用gcc和libc,这正是我观察到的,但问题是面临与视觉工作室(cl.exe)和相应的库。它似乎是由Microzoft记录的,'d'和'D'也支持标记双。 – 2011-06-03 13:55:06

0

哪个平台和编译器?在Linux和Mac OS X上我得到这样的结果:

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

这意味着只有e工作。请注意,你没有检查错误...

+0

请参阅上面的评论。 – 2011-06-03 13:55:48

1

使用D代替E是Fortran标记double数据(而不是float)的方法。你可能正在使用一个标准的库来接受它作为扩展。

+1

请注意,这样的扩展是不符合要求和危险的。 strtod的行为非常严格地由标准规定,并且要求停止任何不匹配的字符。 – 2011-06-02 16:59:38

+0

谢谢..这可能是支持'd'|背后的原因'D'作为strtod的有效角色。 – 2011-06-03 13:55:39

相关问题