3

我觉得这很奇怪。

虽然 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

4 回答 4

4

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

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

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

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

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

于 2011-06-02T15:25:04.967 回答
3

您使用什么编译器/库来编译此代码?假设您在 Visual Studio 上,这种行为是预期的(引用 MSDN 中的文本):

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

[空白] [符号] [数字] [.digits] [ {d | D | 电子| E}[符号]数字]

你可以在这里找到完整的文档strtod

该库的其他实现可能会支持类似的东西。但是,strtodfound here的手册页并没有说明d被识别为用于转换目的的有效字符。在这种情况下,它将导致输入字符串的解析停止,并且只有在该点之前解析的字符才会被转换(包含aand的字符串也会发生同样的情况f)。

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

于 2011-06-02T15:27:23.937 回答
1

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

于 2011-06-02T15:32:40.190 回答
0

哪个平台和编译器?在 Linux 和 Mac OS XI 中都得到这个结果:

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

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

于 2011-06-02T15:26:34.353 回答