C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: バイナリデータの検索について


(過去ログ 55 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■30956 / inTopicNo.1)  バイナリデータの検索について
  
□投稿者/ 凪 (12回)-(2009/01/09(Fri) 17:47:27)

分類:[C/C++] 

WinXP
VC++2003

只今VC++の勉強中です。

バイナリデータについて質問させてください。

悩んでいる内容を簡単に言うと、「strstrのバイナリ版みたいなのはないのか?」という事です。

どういう事かと申しますと、

例:
char* cFind = new char[20];

char* cData = new char[20];

cData = "abcdefghijklmnopqrs";

cFind = strstr(cData,"hij");

とした場合、cFindには"hijklmnopqrs"が入ってくると思います。

ところがcDataに終端文字'\0'が含まれるようなバイナリデータの場合、

cData = "abcdefghijklmno\0pqrs";

のように終端文字が途中にあるとすると、cFindの内容は"hijklmno"までしか入りません。
調べてみると、strstrはその名前の通り文字列を扱う関数のようです。
つまり、文字列として検索したら「終端文字で終わる」というルールに則ってしまうらしいのです。

これではバイナリとしては正しい結果とは言えず、終端文字があっても"hijklmno\0pqrs"と拾えるような関数がないかなぁと思いました。
まだ調べている最中ですが、もし使える関数等がありましたら教えてください。

以上、宜しくお願いします。
引用返信 編集キー/
■30957 / inTopicNo.2)  Re[1]: バイナリデータの検索について
□投稿者/ επιστημη (1504回)-(2009/01/09(Fri) 18:01:40)
επιστημη さんの Web サイト
> 悩んでいる内容を簡単に言うと、「strstrのバイナリ版みたいなのはないのか?」という事です。

stringでおk。

#include <iostream>
#include <string>

using namespace std;

int main() {
  string cData("012345678\0abcde",15); // 途中に'\0'があっても(サイズ指定すりゃ)無問題
  cout << "cDataは" << cData.size() << "文字です\n";
  string::size_type pos = cData.find("abc"); // strstrに相当
  if ( pos != string::npos )
    cout << pos << "文字目に abc があります。\n";
}

実行結果:
cDataは15文字です
10文字目に abc があります。

引用返信 編集キー/
■30958 / inTopicNo.3)  Re[1]: バイナリデータの検索について
□投稿者/ .SHO (527回)-(2009/01/09(Fri) 18:10:43)
No30956 (凪 さん) に返信

>> 例:
> char* cFind = new char[20];
>
> char* cData = new char[20];
>
> cData = "abcdefghijklmnopqrs";
>
> cFind = strstr(cData,"hij");

strstr が返すのは文字列へのポインタなので、cFind は領域確保する必要ないです。
引用返信 編集キー/
■30959 / inTopicNo.4)  Re[2]: バイナリデータの検索について
□投稿者/ επιστημη (1505回)-(2009/01/09(Fri) 18:14:47)
επιστημη さんの Web サイト
2009/01/09(Fri) 18:15:48 編集(投稿者)
> 悩んでいる内容を簡単に言うと、「strstrのバイナリ版みたいなのはないのか?」という事です。

std::search はいかが? 目的も関数名も"どんぴしゃ"ですが。

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
  char cData[] = "012345678\0abcde";
  const char* pat = "abc";
  char* pos = search(cData, cData+15, pat, pat+3); // cDataからpatを探す
  if ( pos != cData+15 )
    cout << pos-cData << "文字目に abc があります。\n";
}

引用返信 編集キー/
■30962 / inTopicNo.5)  Re[2]: バイナリデータの検索について
□投稿者/ επιστημη (1506回)-(2009/01/09(Fri) 18:17:42)
επιστημη さんの Web サイト
> strstr が返すのは文字列へのポインタなので、cFind は領域確保する必要ないです。

御意。

...んーむまだよくわかってないみたいね。
だから文字列はstringで済ませておけとあれほど(笑

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -