【发布时间】:2018-05-26 09:49:13
【问题描述】:
我有以下代码:
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”作为输入来处理,将不胜感激!
【问题讨论】:
-
尝试
printf("{%s}\n",input);(注意大括号)以更清楚地了解函数传递的内容。 -
你的平台是什么?也许您平台上的
strtod实现没有实现"INF"的转换。 -
旁白:在
strtod()之前而不是在printf()之前编码errno = 0;更谨慎 -
在
double xnum = strtod(input, &endptr);之后,添加printf("<%s> <%s> %.20e %d\n", input, endptr, xnum, errno);并报告结果以提供更多信息。