我觉得这很奇怪。
虽然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;
}发布于 2011-06-02 23:27:24
你使用什么编译器/库来编译这段代码?假设您使用的是Visual Studio,则此行为是预期的(引用MSDN中的文本):
strtod期望nptr指向以下形式的字符串:
空格数字[ {d |D|e|E}符号数字]
您可以找到strtod here的完整文档
这个库的其他实现可能会支持类似的东西。但是,strtod found here的手册页并没有说明d被识别为用于转换目的的有效字符。在这种情况下,它将导致对输入字符串的解析停止,只有解析到该点的字符才会被转换(包含a和f的字符串也会发生同样的情况)。
也许您应该查看您的库实现的文档,找出strtod能够针对您的特定情况解析的格式。
发布于 2011-06-02 23:25:05
你说的“接受”是什么意思?这是我得到的输出
::: [1.000000] [10.000000] [1.000000] [1.000000]strtod (与C中的所有其他转换例程一样)解析字符串,直到找到“不属于”的字符。该字符不被视为错误,它只是被视为终止符。在"1d1"的情况下,只解析第一个"1",解析在'd'处停止。转换的结果是1.0 (理应如此)。
如果您要求strtod从每个调用中返回“结束指针”,您将看到指针指向包含'd'的输入字符串的字符'd' ( 'a'和'f'也是如此)。
如果你得到了不同的结果,那一定是你正在使用的实现的怪癖。
发布于 2011-06-02 23:32:40
使用D而不是E是标记double数据(而不是float)的Fortran方法。您可能正在使用一个标准库,该库接受它作为一个扩展。
https://stackoverflow.com/questions/6216577
复制相似问题