我有以下代码:
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/