掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29247

sscanfで該当がNULL
投稿者---しぐうぃん(2006/12/15 17:14:02)


お世話になります。
環境はwindows2000+VC++6/NetBSD1.3.2+GCCです。

行いたいのはコマンドのパラメータの分解です。
','で区切られたデータを各パラメータの文字列変数に入れたいのです。
以下のようなコマンドです。パラメータの最大文字列は12文字です。
$CMD,061215,3531.9279,N,13931.0273,E,0,00,00.00,000047.6,M,0040.3,M,0*\r\n
そこで以下のようなコードを書きました
sscanf(data, "$CMD,%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],*\r\n",
	time,
	latitude,
	latitude_NS,
	longitude,
	longitude_NS,
	GpsStatus,
	GpsNum,
	Dcp,
	Asl,
	AslMes,
	Geoid,
	GeoidMes,
	DgpsTime,
	DgpsStation);

ただ、このコマンドのやっかいなところは、該当パラメータがない時は以下のように文字数が0になる事です。
$CMD,,3531.9279,N,13931.0273,E,0,00,00.00,000047.6,M,0040.3,M,,*

先に示したコードだと、文字数が0だと、そこで止まってしまうのか
全ての変数に何も入りません。
sscanfを使う場合はこういうとき、どのようにすればいいのでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:sscanfで該当がNULL 29248 - 2006/12/15 19:34:45


No.29248

Re:sscanfで該当がNULL
投稿者----(2006/12/15 19:34:45)


13個のフィールドに対して、変数が14個あるように見えます。
仕様どおりでしょうか?数え間違いでしょうか?


この投稿にコメントする

削除パスワード

No.29249

Re:sscanfで該当がNULL
投稿者---しぐうぃん(2006/12/15 20:57:19)


>13個のフィールドに対して、変数が14個あるように見えます。
>仕様どおりでしょうか?数え間違いでしょうか?

そこはバグだったようです。すいませんでした。
が、直して見たけど本件には全く関係なかったようです。

正しくはこちら
sscanf(data, "$CMD,%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^*]*\r\n",
	time,
	latitude,
	latitude_NS,
	longitude,
	longitude_NS,
	GpsStatus,
	GpsNum,
	Dcp,
	Asl,
	AslMes,
	Geoid,
	GeoidMes,
	DgpsTime,
	DgpsStation);



この投稿にコメントする

削除パスワード

No.29250

Re:sscanfで該当がNULL
投稿者----(2006/12/15 21:08:32)


どうしてもsscanfを使わないとまずいのですか?
カンマをフィールド区切り文字として、strtokを使うとかいう
方法は採れますか?


この投稿にコメントする

削除パスワード

No.29252

Re:sscanfで該当がNULL
投稿者---yoh2(2006/12/15 21:25:03)


>どうしてもsscanfを使わないとまずいのですか?
>カンマをフィールド区切り文字として、strtokを使うとかいう
>方法は採れますか?

ssncanf()の%[...]には空ではない文字列が対応しますので、連続するコンマで読み込みが失敗するのは仕様です。
一方、strtok()も空フィールドは飛ばすような仕様ですので、こちらも適しません。
strtok()と近い方法ですが、strchr()でぐるぐる回す方法はいかがでしょう?


この投稿にコメントする

削除パスワード

No.29253

Re:sscanfで該当がNULL
投稿者---しぐうぃん(2006/12/15 22:57:52)


別にsscanfを使わないとまずいわけではないのですが、
せっかくだから、sscanfでなんとか逃げられないかなぁと思ったわけです。

strchr()で見つけても、その前の文字列を取り出すのに一工夫いるので、
長くなっても普通に一文字ずつ取るのが楽かなぁと思います。

色々ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧