整数の場合、strtol
は、最初の変換不可能な文字を指すように設定される2番目の引数を提供します。
ヌルターミネータ\0
以外のものなら、番号の末尾にゴミがあります。元の文字列と等しい場合は、にはの文字が見つかりました。
例:浮動小数点の場合
char *str = "72";
char *estr;
float val = strtol (str, &estr, 10);
if (estr == str) {
// there was no convertible characters.
}
if (*estr != '\0') {
// there was rubbish at the end.
}
if (errno != 0) {
// underflow/overflow.
}
、あなたはstrtoX
機能のいずれかを使用する必要があります。
これは、strtol
関数と非常によく似た動作をします。
使用例:
char *str = "0.9999";
char *estr;
float val = strtof (str, &estr);
if (estr == str) {
// there was no convertible characters.
}
if (*estr != '\0') {
// there was rubbish at the end.
}
if (errno != 0) {
// underflow/overflow.
}
表される文字列を入力するかを動作する機能を以下に完全なプログラムに示されている:myprog 12345 hello 12.7 1e2 0.4 .1 "" 0
で実行すると
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#define TYP_INTEGRAL 0
#define TYP_FLOATING 1
#define TYP_BAD 2
int getTypeAndData (char *str, long *valL, float *valF) {
char *end;
*valL = strtol (str, &end, 10);
if ((end != str) && (*end == '\0'))
return TYP_INTEGRAL;
*valF = strtof (str, &end);
if ((end != str) && (*end == '\0'))
return TYP_FLOATING;
return TYP_BAD;
}
int main (int argc, char *argv[]) {
char *desc[] = {"INT", "FLT", "BAD"};
int i, typ;
long lvar;
float fvar;
for (i = 1; i < argc; i++) {
lvar = 0; fvar = 0;
typ = getTypeAndData (argv[i], &lvar, &fvar);
printf ("%s: [%-10s] %10ld %10.3f\n", desc[typ], argv[i], lvar, fvar);
}
return 0;
}
、出力されます:
INT: [12345 ] 12345 0.000
BAD: [hello ] 0 0.000
FLT: [12.7 ] 12 12.700
FLT: [1e2 ] 1 100.000
FLT: [0.4 ] 0 0.400
FLT: [.1 ] 0 0.100
BAD: [ ] 0 0.000
INT: [0 ] 0 0.000
があります。少なくとも、私がすぐに思いつく単体テストケースは検出されています。
これは、アンダーフローとオーバーフローの状態を直接伝えないことに注意してください。これらのケースではデフォルト値が返されますが、通常はそれが合理的なオプションですが、復帰後にerrno
をチェックすることで、その条件を捕捉したい場合があります。
なぜ浮動小数点を扱うのであれば、 'strtof'または' strtod'を使わないのですか? –