文字列の長さを制限することはできませ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 を指定します。これは、その特定のフィールドに対して最大 3sscanf()
文字を読み取り、解析の最後までに消費された文字数を に保存することを意味します。毎回正確に 3 文字を読み取る必要がある場合は、その値を確認できます。3 つ以下で問題ない場合は、そのまま使用できます。参考までに、幅指定子のドキュメントを次に示します。numCharsRead
sscanf(str, "%3lf", &val)
最大フィールド幅を指定するオプションの 10 進整数。文字の読み取りは、この最大値に達するか、一致しない文字が見つかったときのいずれか早い方で停止します。ほとんどの変換では最初の空白文字が破棄され (例外は以下に示されています)、これらの破棄された文字は最大フィールド幅にはカウントされません。文字列入力の変換では、入力の終わりを示すために終端のヌル バイト ('\0') が格納されます。最大フィールド幅には、このターミネータは含まれません。