7

strtod( ) 関数を使用して環境変数を文字列として抽出し、strtod を使用して double に変更しています。

enter code here
 char strEnv[32];
 strncpy(strEnv, getenv("LT_LEAK_START"), 31);
 // How to make sure before parsing that env LT_LEAK_START is indeed a number?
 double d = strtod(strEnv, NULL);

ここで、ユーザーが入力したこの番号が文字列や特殊文字ではなく数字であることを確認したいと思います。どうすればそれを確認できますか?

コード スニペットは非常に役立ちます。

前もって感謝します。

4

6 に答える 6

16

関数の2番目の引数strtodは便利です。

char *err;
d = strtod(userinput, &err);
if (*err == 0) { /* very probably ok */ }
if (!isspace((unsigned char)*err)) { /* error */ }

編集:例を追加

このstrtod関数は、最初の引数の最初の部分をdoubleに変換しようとし、charがなくなるか、doubleを作成するために使用できないcharがあると停止します。

入力結果
---------- ----------------------------
「42foo」は42を返します
              errが「foo」を指しているままにします(* err =='f')

「4.5」は4.5を返します
              errが空の文字列を指しているままにします(* err == 0)

「42」は42を返します
              スペースを指す`err`を残します(* err =='')
于 2011-04-07T12:32:31.990 に答える
3

man strtod:変換が実行されない場合、ゼロが返され、nptrの値がendptrによって参照される場所に格納されます。

char * endptr;
double d = strtod(strEnv, &endptr);
if (strEnv == endptr)
   /* invalid number */
else
   ...
于 2011-04-07T12:34:28.590 に答える
1
  • まず、戻り値を確認しますgetenv- NULL の場合、その環境変数は存在しません。
  • 次に、戻り値がgetenvNULL でない場合、値は文字列として取得されます。
  • char ** endptr3 番目に、 のパラメーターを NULL に設定しないでstrtodください。ただし、それを使用して、変換された値の有効性を確認し、0.0.
于 2011-04-07T12:34:44.773 に答える
0

strtodに設定したの2番目の引数はNULL、pointer-to-pointer-to-charにすることができます。それが指すcharへのポインタは、最後strtodに解析された後に文字に設定されます。それが文字列の終わりである場合、または少なくともその後に空白以外の何もない場合、あなたが持っていたのは数字でした。そうでなければ、それは別のものでした。

于 2011-04-07T12:32:01.367 に答える
0

この言語についてはよくわかりませんが、入力が間違っている場合、strtod()が0.0を返すことは知っています。正規表現を使用して、入力文字列が数値であることを検証できるかもしれません。

于 2011-04-07T12:33:07.857 に答える