char型ASCIIデータをdouble型10進数データに変換

[戻る]
lampdam [E-Mail] 2007/12/26(水) 20:04:20
初投稿です。

CまたはC++で
以下の様なchar型ASCIIデータ

「+1254-0087+1224-0100」

をdouble型

「a=1254,b=-87,c=1224,d=-100」

の様な10進数データに変換するにはどのようなアルゴリズムのプログラミング
をすればよいのでしょうか。

ご指導よろしくお願いします。

lampdam 2007/12/26(水) 20:13:42
失礼しました。

開発環境は
WinXP、Borland C++ Compiler 5.5 または VC++.net 2003
です。

Blue 2007/12/26(水) 20:28:38
strtodとか。

lampdam 2007/12/26(水) 21:12:18
C言語初心者ですので、初歩的な質問でしたら申し訳ありません。

strtod()関数をもちいて、上記のASCIIコードの「1254」「0087」をとりだして、
「+」「-」も判定し、double型にするには具体的にはどのようなプログラムにすれば
よいのでしょうか?

しま 2007/12/26(水) 22:11:45
数字以外が見つかったところが数(かず、すう)として扱うまとまりの終わり
ということで区切りたいということですか?

それなら、
あ)文字列の中に数字の列が符号の次に続いているので先ず符号を取り出す
い)符号のすぐ後ろの文字列の先頭から順に見ていって数の終わりを探す
う)符号と符号に続く数字の列の最後までが取り扱いたい塊(かたまり)
え)これ(あ〜う)を文字列の最後まで続ける

という方針でよいように思います

tetrapod 2007/12/26(水) 22:22:26
まあとりあえず strtod のマニュアルを見て一度使ってみれってことだ
初心者だからこそ自分で一度は試さんと上達しないぞ
上達したくないなら教えてクンでもかまわんけどな

lampdam 2007/12/27(木) 12:06:19
>しまさん
>tetrapodさん
昨日はよく自分で確かめてもみずに質問ばかりしてしまい、失礼しました。
strtod関数は「+」「-」の判定もできることがわかり、昨日皆様にお聞きした内容が検
討違いなものであるか分かりました。
しまさん、こんな質問にも丁寧に答えていただきありがとうございます。

strtod関数を使ってみて質問があるのですが、もしよければ教えていただけないでしょ
うか?

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

int main()
{
    int i,j;
    char a[21] = "+1254-0087+1224-0100",X1[5],Y1[5],*e;
    double x1,y1;

    for (i = 0; i < 5; i++)
        X1[i]=a[i];
    x1 = strtod(X1, &e);

    for (j = 5; j < 10; j++)
        Y1[j]=a[j];
    y1 = strtod(Y1, &e);

    printf("x1=%g y1=%g\n", x1,y1);
    return 0;
}
----------------------------------------------------------------

上記のようなプログラムを書いたのですが、y1の出力が0になってしまいます。
iの範囲を5〜9にしても、x1が0になってしまうのですが、理由がわからず詰まってい
ます。

昨日失礼な質問をしたばかりで恐縮ですが、よろしくお願いします。

Blue 2007/12/27(木) 12:35:04
strtodの第二引数が何かを理解しましょう。

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

int main(void)
{
    char text[21] = "+1254-0087+1224-0100";
    char* p;
    double a, b, c, d;

    a = strtod(text, &p);
    b = strtod(p, &p);
    c = strtod(p, &p);
    d = strtod(p, NULL);

    printf("a=%g,b=%g,c=%g,d=%g\n", a, b, c, d);

    return 0;
}

lampdam 2007/12/27(木) 12:58:22
[[解決]]
>Blueさん
昨日に引き続き、早速のお返事ありがとうございます。

自分がポインタについてよく理解していなかったことが、分かりましたが
おかげさまで解決できました。

古いスレッドには追加発言できません。