- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码:
int check_for_non_number(char *input, int lineNum)
{
errno = 0;
char *endptr;
printf("%s\n",input);
double xnum = strtod(input, &endptr);
// IF endptr FOUND A NON-VALID ENTRY AND THAT ENTRY IS NOT THE NEW LINE CHARACTER THEN ITS AN ERROR
if((*endptr) && (*endptr != '\n'))
{
return 1;
}
// We still want to process this number, even if it is represented as inf, so inform the user in the terminal and then return 0
else if (errno == ERANGE)
{
printf("\nOPERAND IS OUT OF RANGE ON LINE %d\n",lineNum);
return 0;
}
// ELSE IF endptr FOUND A NON-VALID ENTRY AND THAT ENTRY IS THE NEW LINE CHARACTER THEN RETURN 2 TO CHECK IF IT SHOULD BE A NEW LINE
else if((*endptr) && (*endptr == '\n'))
{
return 2;
}
else
{
return 0;
}
}
input
的值来自 strtok()
并被传递到 check_for_non_number
函数...
问题是当 strtok 从文本文件中读取“inf”时,我的函数返回 1,暗示第一个参数为真...为清楚起见,文本文件中的“inf”位于文本文件行的中间,因此它前后都有文本,并且在它前后使用了 strtok。
如果有人能阐明为什么 strtod()
没有将“inf”作为输入处理,我们将不胜感激!
最佳答案
C11 标准要求 strtod()
识别INF
:
The expected form of the subject sequence is an optional plus or minus sign, then one of the following:
- a nonempty sequence of decimal digits optionally containing a decimal-point character, then an optional exponent part as defined in 6.4.4.2;
- a 0x or 0X, then a nonempty sequence of hexadecimal digits optionally containing a decimal-point character, then an optional binary exponent part as defined in 6.4.4.2;
- INF or INFINITY, ignoring case
NAN or NAN(n-char-sequenceopt), ignoring case in the NAN part, where:
n-char-sequence:
digit
nondigit
n-char-sequence digit
n-char-sequence nondigitThe subject sequence is defined as the longest initial subsequence of the input string, starting with the first non-white-space character, that is of the expected form. The subject sequence contains no characters if the input string is not of the expected form.
如果您可以证明(通过使用诸如 "inf"
之类的字符串调用您的函数)它无法将其转换为无穷大,那么您在 strtod() 中存在错误
由您的实现提供——或者它符合 C90 但不符合 C99 或更高版本。 strtod()
的 C90 规范没有提到十六进制格式(这些是在 C99 中添加到语言中的),也没有提到无穷大或 NaN 处理。从 C99 开始,需要支持这些符号。
如果您受困于 C90 运行时库,则必须升级到具有支持的较新版本,或者实现您自己的 strtod()
变体,或者选择一个开源实现。警惕开源实现还需要多少额外的支持代码才能正确处理语言环境等。
请注意,Microsoft Visual Studio 2017 运行时似乎支持 strtod()
的 C11 规范,以及 2015 版本(这是 Microsoft Docs 网站上最早可用的版本)。如果您使用的是旧版 MSVS,则需要升级。
关于c - strtod 不识别 inf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47777205/
这个问题已经有答案了: Is floating point math broken? (33 个回答) 已关闭 7 年前。 我的 strtod() 有问题似乎添加了一些数字。我正在阅读 2\t5241
这个问题已经有答案了: Is floating point math broken? (33 个回答) 已关闭 7 年前。 我有一个有趣的程序,我想给出一个参数,以便它将触发最后一个 else 条件来
我正在学习 Bjarne Stroustrup 的《编程 - 原则与实践》,一个相当简单的练习让我感到难过(这只是第 11 部分中的第 2 部分)。 #include "../../std_lib_f
我正在学习 C++,并且正在完成一些示例练习。特别是这个接受命令行参数,然后对它们进行数学运算,这样如果我输入 ./ex1 sum 1.0 2.0 3.0 它应该对数字求和。我的代码是这样的: int
我正在使用 strtod() 将字符串转换为十进制。由于我需要为不正确的输入/无效字符抛出错误,所以我别无选择。 然而,问题是 strtod() 受语言环境影响。所以一个'.'当程序在不同的语言环境中
我有一个缓冲区,其中有“随机”数字,用逗号分隔。例如: “1589.3,12478.359,485.39971”等 我需要检查小数部分和整数部分的长度。 我做了一些研究,然后决定在我的缓冲区上使用 s
我不想不必要地重新发明轮子,但我一直在寻找 strtod 的功能,但有一个基本参数 (2,8,10,16)。 (我知道 strtoul 允许一个基本参数,但我正在寻找返回类型 double)。任何正确
在 C++ (Visual C++ 2010) 中使用 strtod 函数将字符串转换为 double 时,我想检测下溢。尽管我根据 strtod 的文档做了以下代码,但它并没有像我预期的那样工作:
效果很好。 #include #include int main(void){ char number[]= "a123.45", *strtod_eptr; double num;
简单的问题:数字 1.15507e-173 的 double 正确位表示是什么?完整问题:如何确定这个数字的正确解析? 背景:我的问题来自 this answer它显示了来自三个不同解析器的两个不同的
如果我想将 char 数组中的前 3 个字符解析为 double,忽略后面的字符,我真的需要这样做吗? int main() { const char a[] = "1.23"; char
我有以下代码: int check_for_non_number(char *input, int lineNum) { errno = 0; char *endptr; pr
我目前正在为我大学的实验室练习开发一个银行终端程序。 让我大吃一惊的是一个函数,它应该接受用户输入的转账金额,检查它是否符合所有要求,如果符合,则返回提供给程序的值。 我们的导师对所有确保输入安全的方
我正在使用 GNU GCC 编译器在代码块编辑器中编码。我尝试使用以下原型(prototype)的函数 strtod: double strtod(const char *a, char **b);
我的 C 项目遇到了一些麻烦。我使用 fgets(line, 1024, stdin) 读取了一行。在该行中,应该有 4 个用空格分隔的参数,如果没有,程序应该写一个警告。像这样的事情: “1f 2
我一直致力于处理如下所示的输入文件的项目: A 0.0345 B 0.3945 ... Z 0.2055 基本上,我正在阅读每一行,在阅读完该行之后,我想仅从字符串中拉出 double 值。我正在尝试
所以我有这个 Java 程序,我用它来处理数 TB 的数据。性能是一个问题。 我分析了该应用程序,所有内存分配的很大一部分以及 CPU 时间的很大一部分来自执行一个简单的操作: 我有一个 ASCII
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 #include ... cin >> str; errno = 0 ; double d = strtod(str
我正在将部分 C++ 程序转换为 Python,但我在替换 C 函数时遇到了一些问题 strtod .我正在处理的字符串由简单的数学方程式组成,例如“KM/1000.0”。问题是常量和数字混合在一起,
我有一个库需要解析总是使用点“.”的双数。作为小数分隔符。不幸的是,对于这种情况,strtod() 尊重可能使用不同分隔符的语言环境,因此解析可能会失败。我不能 setlocale() - 它不是线程
我是一名优秀的程序员,十分优秀!