0

私は問題を抱えており、定義された構造を返します。私の関数 scan_sci は、入力ソースから科学表記法で正の数を表す文字列を取得し、それをコンポーネントに分割して scinot_t 構造に格納することを想定しています。入力例は 0.25000e4 です。

  #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>

    typedef struct{
        double mantissa;
        int exp;
    }sci_not_t;

    int scan_sci (sci_not_t *c);

    int main(void){

        sci_not_t inp1, inp2;

        printf("Enter the mantissa in the range [0.1, 1.0) then its exponent: ");
        scan_sci(&inp1);
        printf("Enter second number with same specifications as above: ");
        scan_sci(&inp2);






      system("PAUSE");  
      return 0;
    }

    int scan_sci (sci_not_t *c){

        int status;
        double a;
        int b;

        status = scanf("%lf %d", &c->mantissa, &c->exp);

        a = c->mantissa;
        b = c->exp;
        *c = pow(a,b);

        if (status == 2 && (c->mantissa >= 0.1 && c->mantissa < 1.0) ){
            status = 1;
        }else{
            printf("You did not enter the mantissa in the correct range \n");
            status = 0;
        }


        return (status);
    }

    sci_not_t sum(sci_not_t c1, sci_not_t c2){

        return c1 + c2;
    }

    sci_not_t product(sci_not_t c1, sci_not_t c2){

        return c1 * c2;
    }
4

4 に答える 4

1

ここには多くの間違いがあります。まず、パラメータが に対して間違っていscan_sciます。宣言した構造体へのポインターを渡すのではなく、文字の配列を渡します。宣言は次のようにする必要があります。

scinot_t scan_sci( scinot_t *collection );

構造体へのポインターを渡すことに準拠するには、宣言を次のように変更します。stackで宣言された変数へのポインターを返すことは非常に悪い習慣であり、エラーが発生しやすいことに注意してくださいscan_sci

void scan_sci( scinot_t *collection );

&関数を呼び出し、演算子を使用してそのメモリ アドレスを渡す前に、構造体を作成する必要があります。

于 2013-08-09T21:33:38.743 に答える
0

私が見るコードの問題の1つは次のとおりです。

printf("%lfe%d", inp1);

これは確実には機能しません (ただし、機能する可能性はあります)。inp1の 2 つの要素を別々に渡す必要があります。

printf("%lfe%d\n", inp1.mantissa, inp1.exponent);

別の問題はスキャン機能にあります。

void scan_sci(scinot_t *value)
{
    *value= scanf("%lfe%d", &value->mantissa, &value->exp);
}

これは、整数値 ( からの戻り値scanf()) を構造体に代入しようとするため、単純に間違っています。次のようなものを使用する必要があると思います。

int scan_sci(scinot_t *value)
{
    if (scanf("%lfe%d", &value->mantissa, &value->exp) != 2)
        return EOF;
    return 0;
}

戻り値は、成功 (0) か失敗 (EOF) かを示すようになりました。あなたはまだ変換仕様を使って%lf陽気に読む問題を抱えており、とは比類のないままです。値が で始まることを要求しない限り、を使用してその問題を回避する簡単な方法はありません。0.25000e4%lfe%dscanf()0.

int scan_sci(scinot_t *value)
{
    int fraction;
    if (scanf("0.%de%d", &fraction, &value->exp) != 2)
        return EOF;
    value->mantissa = ...calculation...
    return 0;
}

ただし、ここでの問題は、最初%dに数値から先頭のゼロが削除されることです (そのため0.0025e4、誤解される可能性があります)。そのため、依然として問題が発生します。数字の文字列をスキャンするのが最善の方法です。

int scan_sci(scinot_t *value)
{
    char digits[1024];
    if (scanf("0.%1023[0-9]e%d", digits, &value->exp) != 2)
        return EOF;
    value->mantissa = ...calculation using the digits string...
    return 0;
}

1024 が大きすぎるかどうかを判断し、それに応じて数値を調整できます。

于 2013-08-09T22:43:22.537 に答える