C STROD不识别inf

C STROD不识别inf,c,strtod,C,Strtod,我有以下代码: 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 CHARACTE

我有以下代码:

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\u for\u non\u number
函数中

问题是,当strtok从文本文件读取“inf”时,我的函数返回1,这意味着第一个参数为true。。。 为了清晰起见,文本文件中的“INF”位于文本文件中线的中间,因此在文本前后有文本,Sttok在前后使用。 如果有人能解释一下为什么strod()不将“inf”作为输入来处理,我们将不胜感激

C11标准要求识别
INF

主题序列的预期形式是可选的加号或减号,然后是以下之一:

  • 可选包含小数点字符的非空十进制数字序列,然后是6.4.4.2中定义的可选指数部分
  • 0x或0x,然后是可选包含小数点字符的十六进制数字的非空序列,然后是6.4.4.2中定义的可选二进制指数部分
  • INF或无穷大,忽略大小写
  • NAN或NAN(n-char-sequenceopt),忽略NAN部分中的大小写,其中:

     n-char-sequence:
             digit
             nondigit
             n-char-sequence digit
             n-char-sequence nondigit
    
主题序列定义为输入字符串的最长初始子序列,从第一个非空白字符开始,即预期形式。如果输入字符串不是预期的形式,则主题序列不包含字符

如果您可以证明(通过使用字符串(如
“inf”
)调用函数无法将其转换为无穷大,那么您的实现提供的
strtod()
中就有一个bug,或者它符合C90,但不符合C99或更高版本。
strod()
的C90规范没有提到十六进制格式(这些格式是在C99中添加到语言中的),也没有提到无穷大或NaN处理。从C99开始,需要支持这些符号

如果您无法使用C90运行时库,则必须升级到支持的较新版本,或者实现自己的
strod()
,或者选择开源实现。要小心,一个开源实现还需要多少额外的支持代码来正确处理区域设置等


请注意,Microsoft Visual Studio 2017运行时似乎支持的C11规范,2015版本也是如此(这是Microsoft Docs网站上最早提供的版本)。如果您使用的MSV版本较旧,则需要升级。

请尝试
printf(“{%s}\n”,输入)(注意大括号)以更清楚地了解传递的函数。您的平台是什么?也许您平台上的strtod实现没有实现对INF的转换。旁白:对code
errno=0更谨慎
就在strtod()之前而不是在printf()之前
就在strtod()之后(input,&endptr),添加
printf(“%.20e%d\n”,输入,endptr,xnum,errno)并报告结果以提供更多信息。请参阅等。OP的系统不符合要求,即他的C运行时库未实现
printf
strtod
正确。很可能是旧的Microsoft C库。有没有办法解决这个问题?@chqrlie:“修复”它的唯一方法是编写自己的
strod()
或下载一个不需要太多其他支持代码的开源版本(例如,语言环境支持可能是个问题)。或者升级到一个更新的系统。问题后面的评论流太长(太多了),因此不利于阅读全部内容。是的,这是我的问题:有没有办法升级Microsoft C运行时库和支持标题?让我惊讶的是,评论中没有人提到缺乏一致性的明显根本原因。您的答案是正确的:实现不符合标准,重新实现
printf
strod
不适合心脏病患者,即使是来自开源库代码。如果可能的话,升级运行时环境似乎是一个更好的选择。