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的转换。旁白:对codeerrno=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
不适合心脏病患者,即使是来自开源库代码。如果可能的话,升级运行时环境似乎是一个更好的选择。