我有以下代码:

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,这意味着第一个参数为true ...
为了清楚起见,文本文件中的“ inf”位于文本文件中行的中间,因此在其前后都有文本,并且在其前后都使用了strtok。

如果有人能阐明为什么strtod()不将“ inf”作为输入的原因,将不胜感激!

最佳答案

C11标准要求strtod()识别INF


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


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

 n-char-sequence:
         digit
         nondigit
         n-char-sequence digit
         n-char-sequence nondigit



主题序列定义为输入字符串的最长初始子序列,从第一个非空白字符开始,即预期的形式。如果输入字符串的格式不正确,则主题序列不包含任何字符。


如果您可以证明(通过使用诸如"inf"之类的字符串调用函数)无法将其转换为无穷大,则说明实现提供的strtod()中存在错误-或它符合C90但不符合C99或更高版本。 C90的strtod()规范没有提及十六进制格式(那些已添加到C99语言中),也没有提及无限性或NaN处理。从C99开始,需要支持这些符号。

如果您仍然使用C90运行时库,则必须在支持下升级到较新版本,或者实现自己的strtod()变体,或者选择开放源代码实现。请注意,开源实现还需要多少额外的支持代码才能正确处理语言环境等。

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

关于c - strtod无法识别信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47777205/

10-15 12:58