2

私は C から始めており、メイン関数の引数が double かどうかを確認する必要があります。strtod を使用しようとしていますが、問題が発生します。したがって、私のメインは次のようになります。

    int main (int argc, char* argv[]){
    if (!(strtod(argv[1], NULL)) /*trouble is with this line*/
       exit(EX_USAGE);
    else{
    /*some code*/
    }
    return(0);   
    }    

strtod を使用して argv[1] を double に解析しましたが (問題はありません)、argv[1] が double でない場合に問題が発生するため、明らかに解析できません。何か案は?

4

4 に答える 4

3

strtod()char ポインターへのポインターである 2 番目の引数があります。そうでない場合はNULL、残りが有効な浮動小数点数表現ではないため、変換を停止した文字列内のアドレスをそのポインターに書き込みます。

文字列全体が正しく変換された場合、明らかにそのポインターは文字列の末尾を指します。適切な測定のために範囲外のチェックがスローされると、変換は次のようになります。

char *endptr;
double result;

errno = 0;
result = strtod(string, &endptr);
if (errno == ERANGE) {
    /* value out of range */
}
if (*endptr != 0) {
    /* incomplete conversion */
}
于 2013-11-09T13:44:37.533 に答える
0

これは明らかかもしれませんargcが、解析するパラメーターがあることを確認していません。あなたはこのようなことをしているはずです:

int main (int argc, char* argv[]) {
    if (argc < 2) {
        exit(EX_USAGE);
    }
    double arg1 = strtod(argv[1], NULL);
    if (arg1==0 && strcmp(argv[1], "0")!=0) {
        exit(EX_USAGE);
    }
    /* some code */
}
于 2013-11-09T15:04:27.237 に答える
0

あなたは男に必要なものをすべて持っています:

名前

   strtod, strtof, strtold - convert ASCII string to floating-point
   number

あらすじ

   #include <stdlib.h>

   double strtod(const char *nptr, char **endptr);

説明

  The strtod(), strtof(), and strtold() functions convert the ini‐
  tial portion of the string pointed to by nptr to double, float,
  and long double representation, respectively.

戻り値

   These functions return the converted value, if any.

   If endptr is not NULL, a pointer to the character after the last
   character used in the conversion is stored in the location ref‐
   erenced by endptr.

   If no conversion is performed, zero is returned and the value of
   nptr is stored in the location referenced by endptr.

この最後の文は特に興味深いと思いました。

于 2013-11-09T13:40:42.873 に答える