虽然strtod()
不允许您限制字符串长度,但您可以使用sscanf()
最大字段宽度和可选检查所消耗的字符数,如下所示:
#include <stdio.h>
double parseDouble(const char *str){
double val = 0;
int numCharsRead;
// Handle errors by setting or returning an error flag.
if(sscanf(str, "%3lf%n", &val, &numCharsRead) != 1){
puts("Failed to parse double!");
}
else if(numCharsRead != 3){
puts("Read less than three characters!");
}
return val;
}
int main(){
printf("%lf\n", parseDouble("1.3")); // 1.300000
printf("%lf\n", parseDouble("1.5999")); // 1.500000
printf("%lf\n", parseDouble(".391")); // 0.390000
printf("%lf\n", parseDouble(".3")); // Read less than three characters!\n0.300000
return 0;
}
sscanf(str, "%3lf%n", &val, &numCharsRead
是重要的部分:您指定最大宽度为 3,这意味着将为该特定字段sscanf()
读取最多 3 个numCharsRead
字符,并将解析结束时消耗的字符数存储在. 如果您关心每次准确读取 3 个字符,则可以检查该值;如果你对 3 个或更少没问题,你可以使用sscanf(str, "%3lf", &val)
. 作为参考,这里是宽度说明符的文档:
一个可选的十进制整数,它指定最大字段宽度。当达到此最大值或找到不匹配的字符时,字符的读取将停止,以先发生者为准。大多数转换会丢弃最初的空白字符(例外情况如下所述),并且这些丢弃的字符不计入最大字段宽度。字符串输入转换存储一个终止空字节('\0')来标记输入的结束;最大字段宽度不包括此终止符。