dポイントプレゼントキャンペーン実施中!

GPSからシリアルポートに流れてくるコンマ区切りのフォーマットをいったんcharにいれて、トークンでぶちぶち切って、違う変数に格納したいです。

流れてくるデータは、
$GPGGA,042449.00,3449.30669291,N,13531.38645000,E,1,4,4.4,81.885,M,34.255,M,,*6D

のような数値です。緯度経度や日付等のデータです。

緯度や経度の数値をfloatやdoubleに変換して変数に格納したいのですが、どうしたらよいでしょうか?

そのまましたらエラーが出てしまいます。

以下は数値をブチブチ切って表示させるプログラムです。




#include <windows.h>
#include <stdio.h>


int main(void)
{
char szSend[] = "$GPGGA,000000.00,0000.00000000,N,00000.00000000,E,0,0,0.0,00.000,M,00.000,M,,*00";
char szBuf[sizeof(szSend)]="$GPGGA,042449.00,3449.30669291,N,13531.38645000,E,1,4,4.4,81.885,M,34.255,M,,*6D";



char *ptr;
ptr=strtok(szBuf,",");
printf("%s\n",ptr);//$GPGGA
ptr=strtok(NULL,",");
printf("%s\n",ptr);//時間
ptr=strtok(NULL,",");
printf("%s\n",ptr);//緯度
ptr=strtok(NULL,",");
printf("%s\n",ptr);//N北
ptr=strtok(NULL,",");
printf("%s\n",ptr);//経度
ptr=strtok(NULL,",");
printf("%s\n",ptr);//E東
ptr=strtok(NULL,",");




return 0;

}


コンパイラはmicrosoftvisualC++6.0です。

floatとかboubleにしたいのは緯度や経度の数値を計算して扱いやすいデータにするためです。

よろしくお願いします。

A 回答 (3件)

間違った文字列が流れて来ない事が前提なら、atofが簡単かな。



double f = atof("123.456");
printf("%f\n", f);
    • good
    • 0
この回答へのお礼

ありがとうございます 無事できました

お礼日時:2005/10/09 17:19

この流れに乗って、strtod() なんてのもありますよね。



#include <stdlib.h>
double strtod(const char *nptr, char **endptr);

つまりこんな感じになりますかね。


doublevalue;
char*endptr;
charstring[] = "123.456abc";

……
value = strtod( string, &endptr );

printf( "value=%f, endptr=%s\n", value , endptr );
/* ⇒ [value=123.456000, endptr=abc] と表示 */


つまり、どこまで変換できたのかをチェックすることが可能な atod() とでも考えれば良いでしょう。

ちなみに、atod() や atof() とは、次のような関係があると考えれば良いでしょう。

value = atod( string );
⇔ value = strtod( string, NULL );

value = atof( string );
⇔ value = (float)strtod( string, NULL );


とりあえず、ご参考までに。。。
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2005/10/09 17:19

入力間違いがない前提ならsscanfが簡単じゃね?



int ret;
double time;
...
ret = sscanf(szBuf, "$GPGGA,%f,...", &time,...);

みたいな感じで。(例中...は省略)
ただし、scanf系統の関数を使うときは、返値をちゃんとチェックすることとフォーマット文字列に合う変数のアドレスをちゃんと渡してやることに注意すること。
使い方の詳細はman scanfなど参照してくれ。
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2005/10/09 17:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!