gpt4 book ai didi

c - strtod 不识别 inf

转载 作者:行者123 更新时间:2023-12-05 01:34:45 25 4
gpt4 key购买 nike

我有以下代码:

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 nondigit

The 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com