根据1999年的C标准,如果被实现支持,
scanf()
和strtod()
应该接受无穷大和NaN作为输入。这两个函数的描述语言很奇特,可能会有不同的解释。
scanf()
的描述如下:
输入项被定义为最长的输入字符序列,它不超过任何指定的字段宽度,并且是匹配输入序列的前缀或匹配输入序列本身。
strtod()
的描述如下:
尽管后一段摘录似乎要求特定的"INF"、 "INFINITY"、 "NAN"或者"NAN(n-char-sequence-opt)"格式,但前一段并不要求这样,因此人们认为以下代码应该产生无穷大和NaN,因为字段宽度包含匹配输入序列的前缀:主题序列被定义为输入字符串的最长初始子序列,从第一个非空格字符开始,具有预期的形式。
int r;
double d;
d = 0; r = sscanf("inf", "%2le", &d);
printf("%d %e\n", r, d);
d = 0; r = sscanf("nan", "%2le", &d);
printf("%d %e\n", r, d);
还有关于scanf()
的这一段:
a,e,f,g匹配一个可选符号的浮点数、无穷大或NaN,其格式与strtod函数的主题序列期望的格式相同。相应的参数应该是指向浮点数的指针。
这是否只是未能记录字段宽度为2(短于预期的最短形式“inf”或“nan”)不会使得与之匹配的前缀“in”和“na”有效的匹配而已?