1

文字列を取得し、文字列の合計値を計算するプログラムを作成しました...例:

char data[256] = "1$0.83331333333333334$false$false"; // the data

ここで、1 + 0.83331333333333334 の計算を行う必要があるため、次のように書きました。

char data[256] = "1$0.83331333333333334$false$false"; // the data
double grade = 0;
int i = 0;
int times = 0;
char temp[256] = "";

int flag = 0;

while (flag == 0)
{
      times = 0;

      if (isdigit(data[i])) // if it's a number
      {
                           if (data[i + 1] == '.') // if it's a double number
                           {
                                      i = i + 2;
                              while (isdigit(data[i])) // putting it into a temp array
                              {
                                  temp[i] = data[i];
                                  i++;
                                  times++;
                              }
                              grade = grade + (double)temp / (times * 10);
                           }
                           grade = grade + (int)data[i]; // if it's an int number, putting it into grade right away
      }

      if (data[i] == '\0')
      {
                  flag = 1;
      }

      i++;
}

printf ("%f\n", grade);

問題は次の行にあります。

grade = grade + (double)temp / (times * 10);

「浮動小数点値が期待される場所で使用されるポインター値」と表示されます。私は本当に何が問題なのか理解できませんでした...

ありがとう :)

編集:

ご協力いただきありがとうございます!数値を文字列に変換することができました..たとえば、データに大きな文字列があり、その中にいくつかの double がある場合、double が新しい文字列になるたびにループを使用できます。double が小さすぎるようですが、atof を使用して double に変換しました。たとえば、文字列 temp : "83331333333333334" に atof を使用しました -> 新しい double には 8333313 がありますただ... 残りは、倍精度には入らないようなものです..倍精度の数値には大きすぎると思います...どうすればいいですか? ありがとう!

4

2 に答える 2

2

char単純に配列をキャストしdoubleて、コンパイラがそれを。として処理することを期待することはできませんdoubletempなどの適切な関数を介して変換し、strtodその値を計算に使用する必要があります。

strodCスタイルの文字列、つまりnullで終了する文字配列が必要であることに注意してください。ですから、渡すだけでtempは十分ではありません。nullで終了する必要があります。tempつまり、数字の挿入が完了したら、を追加しtemp[ i ] = 0;ます。

エラーを修正し、使用するのに役立つと思われる小さなプログラムを次に示しますstrtod

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

int main() {
 char data[256] = "1$0.83331333333333334$false$false"; // the data
 char *p = strtok( &data[ 0 ], "$" ); 
 while (p) {
    double d = strtod( p, NULL );
    printf( "extracted value = %.10f\n", d );
    p = strtok( NULL, "$" );
 }
}

OPはより単純なものを望んでいたのでstrtod

を使用できますdouble atof(const char *nptr);。私のサンプルソースでは、を置き換えてstrtod( p, NULL );くださいatof( p );。と友人の問題atofは、エラー処理が難しく、値を表現できない場合は、未定義の動作を黙って呼び出すことです。

于 2012-06-15T18:41:10.017 に答える
2

tempは配列であり、式で評価されると、最初の要素へのポインターに変換されます。strtod文字列をに変換するために使用しdoubleます。

于 2012-06-15T18:41:27.397 に答える