首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strtod接受"e“,但也接受"d”--为什么?

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

Stack Overflow用户
提问于 2011-06-02 23:20:44
回答 4查看 355关注 0票数 3

我觉得这很奇怪。

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

有人能解释一下吗?

代码语言:javascript
复制
#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;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-02 23:27:24

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

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

空格数字[ {d |D|e|E}符号数字]

您可以找到strtod here的完整文档

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

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

票数 3
EN

Stack Overflow用户

发布于 2011-06-02 23:25:05

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

代码语言:javascript
复制
::: [1.000000] [10.000000] [1.000000] [1.000000]

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

如果您要求strtod从每个调用中返回“结束指针”,您将看到指针指向包含'd'的输入字符串的字符'd' ( 'a''f'也是如此)。

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

票数 4
EN

Stack Overflow用户

发布于 2011-06-02 23:32:40

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6216577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档